একাধিক $ স্কোপ বৈশিষ্ট্য দেখুন


442

একাধিক অবজেক্ট ব্যবহার করে ইভেন্টগুলিতে সদস্যতা নেওয়ার উপায় আছে কি? $watch

যেমন

$scope.$watch('item1, item2', function () { });

উত্তর:


586

অ্যাঙ্গুলারজেএস ১.৩ থেকে শুরু করে একটি নতুন পদ্ধতি রয়েছে যা $watchGroupবাক্সের একটি সেট পর্যবেক্ষণের জন্য ডেকে আনে ।

$scope.foo = 'foo';
$scope.bar = 'bar';

$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
  // newValues array contains the current values of the watch expressions
  // with the indexes matching those of the watchExpression array
  // i.e.
  // newValues[0] -> $scope.foo 
  // and 
  // newValues[1] -> $scope.bar 
});

7
$ ওয়াচ কালেকশন ('[এ, বি]') এর মধ্যে পার্থক্য কী ??
কামিল টমেক

28
পার্থক্যটি হ'ল আপনি অ্যারের মতো দেখতে স্ট্রিংয়ের পরিবর্তে একটি সঠিক অ্যারে ব্যবহার করতে পারেন
পাওলো মোরেটি

2
আমার একইরকম সমস্যা ছিল তবে কন্ট্রোলারআস প্যাটার্ন ব্যবহার করে। আমার ক্ষেত্রে নিয়ামকের নামটি ভেরিয়েবলগুলিতে সংশোধন করে $scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
ফিক্সটি অন্তর্ভুক্ত ছিল

1
এটি আমার জন্য কৌনিক 1.6 এ কাজ করবে বলে মনে হচ্ছে না। যদি আমি ফাংশন উপর একটি কনসোল লগ করা, আমি এটা শুধু সঙ্গে একবার রান দেখতে পারেন newValuesএবং oldValuesযেমন undefinedযখন স্বতন্ত্রভাবে বৈশিষ্ট্য যথারীতি কাজ পর্যবেক্ষক।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

290

AngularJS 1.1.4 দিয়ে শুরু করে আপনি ব্যবহার করতে পারেন $watchCollection:

$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
    // do stuff here
    // newValues and oldValues contain the new and respectively old value
    // of the observed collection array
});

এখানে Plunker উদাহরণ

ডকুমেন্টেশন এখানে


109
মনে রাখবেন যে, প্রথম প্যারামিটার না একটি অ্যারের। এটি একটি স্ট্রিং যা অ্যারের মতো দেখায়।
এমকে সাফি

1
এর জন্য ধন্যবাদ. যদি এটি আমার পক্ষে কাজ করে তবে আমি আপনাকে এক হাজার সোনার মুদ্রা দেব - অবশ্যই ভার্চুয়ালগুলি :)
আদিত্যসেক্সেন

5
পরিষ্কার হওয়ার জন্য (আমাকে বুঝতে কয়েক মিনিট সময় নিয়েছিল) $watchCollectionউদ্দেশ্য হ'ল কোনও বস্তু হস্তান্তর করা এবং অবজেক্টের যে কোনও বৈশিষ্ট্য পরিবর্তনের জন্য একটি ঘড়ি সরবরাহ করা, যেখানে $watchGroupপরিবর্তনের জন্য দেখার জন্য পৃথক বৈশিষ্ট্যগুলির একটি অ্যারে হস্তান্তর করার উদ্দেশ্যে। অনুরূপ এখনও বিভিন্ন সমস্যা মোকাবেলায় সামান্য পৃথক। রাম রাম!
ম্যাটিগাবে

1
আপনি এই পদ্ধতিটি ব্যবহার করার পরে কোনওভাবেই, নতুন ওয়ালিউজ এবং ওল্ডভ্যালুগুলি সর্বদা সমান: plnkr.co/edit/SwwdpQcNf78pQ80hhXMr
Mostruash

ধন্যবাদ। এটি আমার সমস্যার সমাধান করেছে। $ ঘড়ি ব্যবহারের কোনও পারফরম্যান্স হিট / ইস্যু রয়েছে কি?
সৈয়দ নাসির আব্বাস

118

$watch প্রথম প্যারামিটার এছাড়াও একটি ফাংশন হতে পারে।

$scope.$watch(function watchBothItems() {
  return itemsCombinedValue();
}, function whenItemsChange() {
  //stuff
});

যদি আপনার দুটি সম্মিলিত মান সহজ হয় তবে প্রথম প্যারামিটারটি সাধারণত একটি কৌণিক অভিব্যক্তি। উদাহরণস্বরূপ, প্রথম নাম এবং সর্বশেষ নাম:

$scope.$watch('firstName + lastName', function() {
  //stuff
});

8
এটি এমন কোনও ব্যবহারের ক্ষেত্রে মনে হচ্ছে যা ডিফল্টরূপে ফ্রেমওয়ার্কে অন্তর্ভুক্তির জন্য চিৎকার করে। এমনকি সহজ হিসাবে একটি কম্পিউটেড সম্পত্তি হিসেবে fullName = firstName + " " + lastNameপ্রথম আর্গুমেন্ট (বদলে মত সরল অভিব্যক্তি হিসাবে একটি ফাংশন ক্ষণস্থায়ী প্রয়োজন 'firstName, lastName')। কৌণিকটি তাই শক্তিশালী, তবে কিছু ক্ষেত্র রয়েছে যেখানে এটি কার্যকরীভাবে বা নকশার নীতিগুলি (যেগুলি) আপস করে না বলে মনে হয় তা আরও বেশি বিকাশকারী-বান্ধব হতে পারে।
এক্সএমএল

4
ভাল $ ঘড়ির জন্য কেবল একটি কৌণিক অভিব্যক্তি লাগে, যা এটির স্কোপ থেকে মূল্যায়ন করা হয়। সুতরাং আপনি করতে পারে $scope.$watch('firstName + lastName', function() {...})। এছাড়াও আপনি মাত্র দুই ঘড়ির করতে পারে: function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);। আমি উত্তরের সাথে সহজ কেস যোগ করেছি added
অ্যান্ড্রু জোসলিন

'ফার্স্টনেম + লাস্টনাম' এর প্লাসটি স্ট্রিং কনটেনটেশন। সুতরাং কৌনিকটি এখন পরীক্ষা করে ফলাফলের ফলাফল আলাদা কিনা তা পরীক্ষা করে।
এমবি 21

16
স্ট্রিং কনটেনটেশনের জন্য একটু যত্ন নেওয়া দরকার - আপনি যদি "পারান অরমান" থেকে "প্যারা নরম্যান" পরিবর্তন করেন তবে আপনি কোনও প্রতিক্রিয়া প্রকাশ করবেন না; প্রথম এবং দ্বিতীয় মেয়াদের মধ্যে "\ t |" t "এর মতো একটি বিভাজক স্থাপন করা ভাল, বা কেবল JSON এ
লেগে থাকুন

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

70

এখানে আপনার আসল সিউডো-কোডের অনুরূপ একটি সমাধান রয়েছে যা আসলে কাজ করে:

$scope.$watch('[item1, item2] | json', function () { });

সম্পাদনা: ঠিক আছে, আমি মনে করি এটি আরও ভাল:

$scope.$watch('[item1, item2]', function () { }, true);

মূলত আমরা জসন পদক্ষেপ এড়িয়ে চলেছি, যা মনে হচ্ছে বোবা লাগছিল, তবে এটি কাজ করে নি। এগুলি হ'ল প্রায়শই বাদ দেওয়া 3 য় প্যারামিটার যা রেফারেন্স সাম্যতার বিপরীতে অবজেক্টের সাম্যতায় সক্রিয় হয়। তারপরে আমাদের তৈরি অ্যারে অবজেক্টের মধ্যে তুলনা আসলে সঠিকভাবে কাজ করে।


আমারও একই রকম প্রশ্ন ছিল। এবং এটি আমার জন্য সঠিক উত্তর।
ক্যালভিন চেং

অ্যারের এক্সপ্রেশনটিতে আইটেমগুলি সহজ ধরণের না হলে উভয়েরই সামান্য পারফরম্যান্স ওভারহেড থাকে।
নাল

এটি সত্য .. এটি উপাদান উপাদানগুলির সাথে গভীরতার তুলনা করছে। যা আপনি চান তা নাও হতে পারে। আধুনিক কৌণিক ব্যবহার করে এমন কোনও সংস্করণের জন্য বর্তমানে অনুমোদিত উত্তরটি দেখুন যা সম্পূর্ণ গভীরতার তুলনা করে না।
কারেন জিলস

কোনও কারণে, যখন আমি অ্যারেতে $ ওয়াচ কালেকশনটি ব্যবহার করার চেষ্টা করছিলাম তখন আমি এই ত্রুটিটি পেয়েছি TypeError: Object #<Object> has no method '$watchCollection'তবে এই সমাধানটি আমার সমস্যা সমাধানে আমাকে সহায়তা করে!
আবুতুনি

শীতল, আপনি এমনকি বস্তুর মধ্যে মানগুলি দেখতে পারেন:$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
সার্জ ভ্যান ড্যান ওভার

15

সুযোগের কোনও অবজেক্টের ক্ষেত্র নির্বাচন করতে আপনি $ ওয়াচগ্রুপে ফাংশন ব্যবহার করতে পারেন।

        $scope.$watchGroup(
        [function () { return _this.$scope.ViewModel.Monitor1Scale; },   
         function () { return _this.$scope.ViewModel.Monitor2Scale; }],  
         function (newVal, oldVal, scope) 
         {
             if (newVal != oldVal) {
                 _this.updateMonitorScales();
             }
         });

1
আপনি কেন ব্যবহার করবেন _this? সুযোগটি স্পষ্টভাবে সংজ্ঞায়িত না করে কার্যগুলিতে ডুবে যায় না?
sg.cc 21'15

1
আমি টাইপস্ক্রিপ্ট ব্যবহার করি, উপস্থাপিত কোডটি ফলাফল সংকলিত হয়।
ইয়াং জাং

12

কেন কেবল এটিকে মুড়ে ফেলা হয় না forEach?

angular.forEach(['a', 'b', 'c'], function (key) {
  scope.$watch(key, function (v) {
    changed();
  });
});

এটি সম্মিলিত মানটির জন্য কোনও ফাংশন সরবরাহ করার মতো একই ওভারহেড সম্পর্কে, প্রকৃতপক্ষে মান রচনা সম্পর্কে চিন্তা না করে


এই ক্ষেত্রে লগ () কয়েকবার কার্যকর করা হবে, তাই না? আমি মনে করি নেস্টেড-ওয়াচ ফাংশনগুলির ক্ষেত্রে এটি হবে না। এবং এটি একবারে বেশ কয়েকটি বৈশিষ্ট্য দেখার সমাধানে হওয়া উচিত নয়।
জন দো

না, লগ শুধুমাত্র প্রতি দেখা সম্পত্তি হিসাবে পরিবর্তিত একবার সম্পাদন করা হয়। কেন এটি একাধিকবার আহ্বান করা হবে?
এরিক অ্যাগনার

ঠিক আছে, আমি বোঝাতে চাইছি এটি কার্যকর হয় না যদি আমরা তাদের সমস্ত একসাথে দেখতে চাই।
জন দো

1
অবশ্যই না কেন? আমি আমার প্রকল্পে সেভাবে করি। changed()যখনই বৈশিষ্ট্যের যে কোনওটিতে কিছু পরিবর্তন হয় তখনই তাকে ডাকে। এটি হুবহু একই আচরণ যেমন মিলিত মানের জন্য কোনও ফাংশন সরবরাহ করা হয়েছিল।
এরিক অাইনার

1
এটির থেকে কিছুটা আলাদা যে অ্যারেতে থাকা আইটেমগুলির একসাথে একই সময়ে পরিবর্তন হলে $ ঘড়িটি কেবলমাত্র একবার পরিবর্তিত আইটেমের পরিবর্তে হ্যান্ডলারটিকে একবার জ্বালিয়ে দেবে।
29:43

11

মানগুলি একত্রিত করার জন্য কিছুটা নিরাপদ সমাধান হতে পারে আপনার $watchফাংশন হিসাবে নিম্নলিখিতটি ব্যবহার করা :

function() { return angular.toJson([item1, item2]) }

অথবা

$scope.$watch(
  function() {
    return angular.toJson([item1, item2]);
  },
  function() {
    // Stuff to do after either value changes
  });

5

$ প্রথম প্যারামিটারটি কৌণিক অভিব্যক্তি বা ফাংশন হতে পারে $ ডকুমেন্টেশন দেখুন on সুযোগ। $ দেখুন । এটিতে $ ঘড়ির পদ্ধতি কীভাবে কাজ করে: যখন ওয়াচএক্সপ্রেশন বলা হয়, কৌণিক কীভাবে ফলাফলগুলির সাথে তুলনা করে ইত্যাদি সম্পর্কে প্রচুর দরকারী তথ্য রয়েছে It


4

কেমন:

scope.$watch(function() { 
   return { 
      a: thing-one, 
      b: thing-two, 
      c: red-fish, 
      d: blue-fish 
   }; 
}, listener...);

2
তৃতীয় trueপ্যারামিটার ছাড়াই scope.$watch(যেমন আপনার উদাহরণ হিসাবে) listener()প্রতিবারই গুলি চালানো হবে, কারণ বেনামে হ্যাশটির প্রতিবার একটি আলাদা রেফারেন্স রয়েছে।
পিটার ভি।

আমি দেখতে পেলাম যে এই সমাধানটি আমার পরিস্থিতির জন্য কাজ করেছে। আমার জন্য, এটি আরো ভালো ছিল: return { a: functionA(), b: functionB(), ... }। আমি তখন একে অপরের বিরুদ্ধে নতুন এবং পুরানো মানগুলির প্রত্যাবর্তিত বস্তুগুলি পরীক্ষা করি check
রেভনোহা

4
$scope.$watch('age + name', function () {
  //called when name or age changed
});

বয়স এবং নাম উভয়ই পরিবর্তিত হলে এখানে ফাংশনটি কল করা হবে।


2
এছাড়াও এক্ষেত্রে নিশ্চিত হন যে ক্যালব্যাকটিতে কৌণিক পাস হওয়া নতুন ওালিউ এবং ওল্ডভ্যালু যুক্তিগুলি ব্যবহার করবেন না কারণ এগুলি কেবল পরিবর্তিত ক্ষেত্র নয়, ফলস্বরূপ বক্তব্য হবে
আকাশ শিন্ডে

1

কৌণিকটি $watchGroupভার্সন ১.৩ এ প্রবর্তিত হয়েছিল যার সাহায্যে আমরা একাধিক ভেরিয়েবল দেখতে পারি, একটি একক $watchGroupব্লককে $watchGroupপ্রথম প্যারামিটার হিসাবে অ্যারে নেওয়া হয় যাতে আমরা আমাদের ভেরিয়েবলগুলি দেখার জন্য অন্তর্ভুক্ত করতে পারি।

$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
   console.log("new value of var1 = " newVals[0]);
   console.log("new value of var2 = " newVals[1]);
   console.log("old value of var1 = " oldVals[0]);
   console.log("old value of var2 = " oldVals[1]);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.