অ্যাঙ্গুলারজেএস-এ মডেল পরিবর্তনগুলি দেখার সময় আমি কীভাবে প্রাথমিক লোডটিকে উপেক্ষা করব?


183

আমার একটি ওয়েব পৃষ্ঠা রয়েছে যা একটি একক সত্তার সম্পাদক হিসাবে কাজ করে যা which স্কোপ.ফিল্ড কনটেনার সম্পত্তিটিতে একটি গভীর গ্রাফ হিসাবে বসে। আমার REST এপিআইয়ের ($ রিসোর্সের মাধ্যমে) থেকে প্রতিক্রিয়া পাওয়ার পরে আমি 'ফিল্ডকন্টেইনার'-এ একটি ঘড়ি যুক্ত করব। পৃষ্ঠা / সত্তাটি "নোংরা" আছে কিনা তা সনাক্ত করতে আমি এই ঘড়িটি ব্যবহার করছি। এই মুহূর্তে আমি সেভ বোতামটি বাউন্স করছি তবে সত্যই আমি সেভ বোতামটি অদৃশ্য করতে চাই যতক্ষণ না ব্যবহারকারী মডেলটি উত্সাহিত করে।

আমি যা পাচ্ছি তা হ'ল ঘড়ির একক ট্রিগার, যা আমি মনে করি কারণ ঘটছে because ফিল্ড কন্টেইনার = ... অ্যাসাইনমেন্টটি আমার ঘড়িটি তৈরি করার সাথে সাথেই ঘটে। আমি প্রাথমিক মিথ্যা অ্যালার্ম শোষণের জন্য কেবল "নোংরা কাউন্ট" সম্পত্তিটি ব্যবহার করার কথা ভাবছিলাম তবে এটি খুব কৃপণ বোধ করে ... এবং আমি বুঝতে পেরেছিলাম যে এটির মোকাবেলার জন্য একটি "কৌণিক আইডিয়োমেটিক" উপায় থাকতে হবে - আমি কেবল একা নই একটি নোংরা মডেল সনাক্ত করতে একটি ঘড়ি ব্যবহার করে।

আমি আমার ঘড়িটি সেট করেছি এমন কোডটি এখানে:

 $scope.fieldcontainer = Message.get({id: $scope.entityId },
            function(message,headers) {
                $scope.$watch('fieldcontainer',
                    function() {
                        console.log("model is dirty.");
                        if ($scope.visibility.saveButton) {
                            $('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
                        }
                    }, true);
            });

আমি কেবল এই ভাবতে থাকি যে "" (নোংরা অ্যাকাউন্ট> 0) "দিয়ে আমার" ইউআই গন্ডগোল "কোডটি রক্ষা করার চেয়ে এটি করার একটি পরিষ্কার উপায় হতে পারে ...


কিছু নির্দিষ্ট বোতামের উপর ভিত্তি করে আমাকে $ স্কোপ.ফিল্ড কনটেনার পুনরায় লোড করতে সক্ষম হওয়া প্রয়োজন (যেমন সত্তার আগের সংস্করণটি লোড করা)। এর জন্য, আমাকে ঘড়িটি স্থগিত করা, পুনরায় লোড করা এবং তারপরে ঘড়িটি আবার চালু করা দরকার।
কেভিন হফম্যান

আপনি কি আমার উত্তরকে গ্রহণযোগ্য উত্তর হিসাবে বিবেচনা করবেন? যাঁরা এতে সমস্ত সময় পড়তে সময় নেয় তারা agreeক্যমতে সম্মত হন যে এটি সঠিক সমাধান।
ত্রিপক্ষের

@ ট্রাইসচারে আমার একই ওপি সমস্যা রয়েছে, তবে আমার ক্ষেত্রে আপনার উত্তরটি কার্যকর হয় না, কারণ আমার পুরানো মূল্য এটি নয় undefined। এটির একটি ডিফল্ট মান রয়েছে যা আমার মডেল আপডেটের ক্ষেত্রে প্রয়োজনীয় সমস্ত তথ্য নিয়ে আসে না। সুতরাং কিছু মান পরিবর্তন হয় না তবে ট্রিগার করতে হয়।
oliholz

@ ওলিহলজ তাই অপরিজ্ঞাত বিরুদ্ধে পরীক্ষা করার পরিবর্তে, "টাইপফ" বের করুন এবং আপনার ডিফল্ট মানের তুলনায় ওল্ডফিল্ডকন্টেইনারটি পরীক্ষা করুন।
ত্রৈমাসিক

@ কেভিনহফম্যান আপনার এই প্রশ্নটি খুঁজে পাওয়ার জন্য অন্য জনগণের সঠিক উত্তরে এমডব্লু এর উত্তর চিহ্নিত করতে হবে। এটি অনেক উন্নত সমাধান। ধন্যবাদ!
Dev01

উত্তর:


117

প্রাথমিক লোডের ঠিক আগে একটি পতাকা সেট করুন,

var initializing = true

এবং তারপরে যখন প্রথম $ আগুন দেখায়, তখন করুন

$scope.$watch('fieldcontainer', function() {
  if (initializing) {
    $timeout(function() { initializing = false; });
  } else {
    // do whatever you were going to do
  }
});

বর্তমান ডাইজেস্ট চক্রের শেষে পতাকাটি ছিঁড়ে যাবে, সুতরাং পরবর্তী পরিবর্তনকে অবরুদ্ধ করা হবে না।


17
হ্যাঁ, এটি কার্যকর হবে তবে @ এমডাব্লু দ্বারা প্রস্তাবিত পুরানো এবং নতুন মান পদ্ধতির তুলনা করুন। উভয়ই সহজ এবং আরও কৌণিক প্রতিমা। আপনি কি গৃহীত উত্তর আপডেট করতে পারবেন?
গ্রিরিস্টার

2
পুরানোভ্যালুকে সর্বদা প্রথম আগুনে নতুন ভ্যালুকে সমান করাতে এই পতাকাটি হ্যাক না করাতে বিশেষভাবে যুক্ত করা হয়েছিল
চার্লি মার্টিন

2
মেগাওয়াটের উত্তরটি প্রকৃতপক্ষে ভুল কারণ পুরানো মানটির নতুন মানটি যেখানে পুরনো মানটি অপরিজ্ঞাত করা হয়েছে সেখানে পরিচালনা করবে না।
ত্রিপক্ষের

1
মন্তব্যকারীদের জন্য: এটি কোনও দেবতা মডেল নয়, কোনও কিছুই আপনাকে সাজসজ্জার ক্ষেত্রের ভিতরে 'আরম্ভীকৃত' পরিবর্তনশীল রাখতে বাধা দেয় না এবং তারপরে এটি আপনার "সাধারণ" ঘড়িটি সাজাতে পারে। যে কোনও ক্ষেত্রে এটি এই প্রশ্নের ক্ষেত্রের বাইরে সম্পূর্ণ।
পুনরায়

1
প্রস্তাবিত পদ্ধতির তুলনা করার জন্য প্লেনক্রা.কম / এডিট / ভিআরআরএইচএইচউউইউইউএইচইউডব্লিউএনএইচএস 3 জেএসআই দেখুন , উভয় .get () কলব্যাকে নজরদারি স্থাপন এবং স্কোপ ইনিশিয়ালেশনের জন্য।
পুনরায়

482

শ্রোতাকে প্রথমবার বলা হলে পুরানো মান এবং নতুন মানটি অভিন্ন হবে। সুতরাং কেবল এটি করুন:

$scope.$watch('fieldcontainer', function(newValue, oldValue) {
  if (newValue !== oldValue) {
    // do whatever you were going to do
  }
});

এটি কৌনিক দস্তাবেজগুলি হ্যান্ডল করার প্রস্তাব দেয় :

কোনও প্রহরী সুযোগের সাথে নিবন্ধিত হওয়ার পরে, শ্রোতাদের fn প্রহরীকে আরম্ভ করার জন্য অ্যাসিনক্রোনাসলি ($ evalAsync মাধ্যমে) বলা হয়। বিরল ক্ষেত্রে, এটি অনাকাঙ্ক্ষিত কারণ শ্রোতাদের ডাকা হয় যখন ওয়াচএক্সপ্রেসের ফলাফল পরিবর্তন হয় নি। শ্রোতা fn এর মধ্যে এই দৃশ্য সনাক্ত করতে, আপনি নতুন ওয়াল এবং পুরাতনকে তুলনা করতে পারেন। যদি এই দুটি মান একই হয় (===) তবে শ্রোতাকে আরম্ভের কারণে ডাকা হয়েছিল


3
@ লিখিত জবাবের চেয়ে এই উপায়ে আরও
মূর্তিমান

25
এটি সঠিক নয়। বিন্দুটি nullপ্রাথমিক লোড হওয়া মান থেকে পরিবর্তনটিকে অগ্রাহ্য করা হয়, যখন কোনও পরিবর্তন থাকে না তখন পরিবর্তনটি উপেক্ষা করা হয় না।
পুনরায়

1
ঠিক আছে, ঘড়িটি তৈরি হওয়ার পরে শ্রোতার ফাংশন সর্বদা ট্রিগার হবে। এটি সেই প্রথম কলটিকে অগ্রাহ্য করে, যা আমি বিশ্বাস করি যে প্রশ্নকারীটি চেয়েছিল। পুরানো মানটি শূন্য হওয়ার সময় যদি তিনি বিশেষত পরিবর্তনটি উপেক্ষা করতে চান তবে তিনি অবশ্যই ওল্ডভ্যালুকে শূন্যের সাথে তুলনা করতে পারেন ... তবে আমি মনে করি না যে তিনি এটি করতে চেয়েছিলেন।
মেগাওয়াট

ওপি বিশেষত সংস্থানসমূহের পর্যবেক্ষকদের সম্পর্কে জিজ্ঞাসা করছে (আরআরএসটি পরিষেবাগুলি থেকে)। সংস্থানগুলি প্রথমে তৈরি করা হয়, তারপরে পর্যবেক্ষকরা প্রয়োগ করে এবং তারপরে প্রতিক্রিয়া থেকে গুণাবলী লেখা হয় এবং কেবল তখনই কৌণিক একটি চক্র তৈরি করে। একটি "আরম্ভকরণ" পতাকাটি দিয়ে প্রথম চক্র এড়িয়ে যাওয়া কেবল প্রারম্ভিক উত্সগুলিতে একটি প্রহরী প্রয়োগ করার একটি উপায় সরবরাহ করে তবে এখনও / থেকে পরিবর্তনগুলি পর্যবেক্ষণ করে null
পুনরায়

7
এটি ভুল, oldValueপ্রথম যেতে যেতে নਾਲ হবে।
কেভিন সি

42

আমি বুঝতে পারি যে এই প্রশ্নের উত্তর দেওয়া হয়েছে, তবে আমার একটি পরামর্শ রয়েছে:

$scope.$watch('fieldcontainer', function (new_fieldcontainer, old_fieldcontainer) {
    if (typeof old_fieldcontainer === 'undefined') return;

    // Other code for handling changed object here.
});

পতাকা ব্যবহার করে কাজ করে তবে কিছুটা কোডের গন্ধ রয়েছে তা কি আপনি ভাবেন না?


1
এই পথেই যেতে হবে। কফিস্ক্রিপ্টে এটি এতটা সহজ return unless oldValue?(? সিএসে অস্তিত্বশীল অপারেটর)।
কেভিন সি

1
কোড গন্ধে প্রপস! godশ্বর অবজেকটিও দেখুন ol খুব ভাল.
ম্যাথু হারউড

1
যদিও এটি গৃহীত উত্তর নয়, এটি কোনও এপিআই থেকে কোনও অবজেক্টকে পপুলেট করার সময় আমার কোডটি কাজ করে এবং আমি বিভিন্ন সংরক্ষণের অবস্থা দেখতে চাই। খুব সুন্দর.
লুকাস রেপ্প ওয়েল্যান্ডার

1
ধন্যবাদ - এটি আমার পক্ষে সাহায্য করেছে
ওয়ান্ডার মেকার

1
এটি দুর্দান্ত, তবে আমার ক্ষেত্রে আমি আমার এপিআইতে আজেএক্স কল করার আগে খালি অ্যারে হিসাবে ডেটা ইনস্ট্যান্ট করেছিলাম, সুতরাং টাইপের পরিবর্তে এর দৈর্ঘ্যটি পরীক্ষা করে দেখুন। তবে এই উত্তরটি অবশ্যই সবচেয়ে কার্যকর পদ্ধতিটি অন্ততপক্ষে দেখায়।
সবোরকনাইট

4

বর্তমান মানগুলির প্রাথমিক লোডিংয়ের সময় পুরানো মান ক্ষেত্রটি অপরিজ্ঞাত হয়। সুতরাং নীচের উদাহরণটি প্রাথমিক লোডিংগুলি বাদ দেওয়ার জন্য আপনাকে সহায়তা করে।

$scope.$watch('fieldcontainer', 
  function(newValue, oldValue) {
    if (newValue && oldValue && newValue != oldValue) {
      // here what to do
    }
  }), true;

আপনি সম্ভবত ব্যবহার করতে চান! == যেহেতু nullএবং undefinedএই পরিস্থিতিতে ম্যাচ হবে, বা ( '1' == 1ইত্যাদি)
জেমি প্যাট

সাধারণভাবে আপনি ঠিক বলেছেন। তবে সেক্ষেত্রে আগের চেকগুলির কারণে নিউভ্যালু এবং ওল্ডভ্যালু এ জাতীয় কোণ হতে পারে না। উভয় মান একই ধরণের কারণ একই ক্ষেত্রের অন্তর্গত। ধন্যবাদ.
তাহসিন তুরোকোজ

3

নতুন ভ্যালোর অবস্থাটি কেবল বৈধ করুন:

$scope.$watch('fieldcontainer',function(newVal) {
      if(angular.isDefined(newVal)){
          //Do something
      }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.