दिलचस्प पोस्ट
अनुरोध डेटा खोए बिना ASP.NET MVC में रीडायरेक्ट टाईएक्शन कैसे करें एक चुनिंदा ड्रॉप-डाउन सूची से एक आइटम का चयन करते समय स्वचालित रूप से रीडायरेक्ट करें रेल सर्वर ओएसएक्स 10.6.5 पर आरवीएम और रूबी 1.9.2-पी 0 का उपयोग करके mysql2 के साथ शुरू करने में विफल रहता है एक मानक :: नक्शा जो प्रविष्टि के आदेश का ट्रैक रखता है? एंड्रॉइड एप्लिकेशन का पैकेज नाम कैसे बदलना है Android समायोजन पहली बार के बाद काम नहीं कर रहा है एक जावास्क्रिप्ट फ़ंक्शन को कॉल करने के लिए एक HTML बटन का उपयोग करना कैसे Android में टोस्ट की स्थिति को बदलने के लिए? Facebook पर मित्र के दोस्तों की एक सूची प्राप्त करें एक स्थिर निर्माता क्या है? वास्तव में जावाबीन क्या है? आईओएस डिवाइस लॉक होने पर या किसी अन्य एप्लिकेशन पर पृष्ठभूमि ऑडियो चलाने के तरीके को कैसे संभालना है? सेट अंतराल रोकें एक्सएमएलपीआरएसपीएफ़ परियोजना की तैनाती के बाद एक्सपेशेशन डीबी के सभी तालिकाओं, पंक्तियों और स्तंभों में स्ट्रिंग खोजें

कैसे angularjs में एक सरणी को देखने के लिए गहरा?

मेरे दायरे में वस्तुओं की एक सरणी है, मैं प्रत्येक वस्तु के सभी मूल्यों को देखना चाहता हूं।

यह मेरा कोड है:

function TodoCtrl($scope) { $scope.columns = [ { field:'title', displayName: 'TITLE'}, { field: 'content', displayName: 'CONTENT' } ]; $scope.$watch('columns', function(newVal) { alert('columns changed'); }); } 

लेकिन जब मैं मानों को संशोधित करता हूं, जैसे मैं TITLE को TITLE2 , तो alert('columns changed') कभी भी पॉप नहीं हुआ।

कैसे सरणी के अंदर वस्तुओं को देखने के लिए?

एक लाइव डेमो है: http://jsfiddle.net/SYx9b/

Solutions Collecting From Web of "कैसे angularjs में एक सरणी को देखने के लिए गहरा?"

आप $watch के तीसरे तर्क को true सेट कर सकते हैं:

 $scope.$watch('data', function (newVal, oldVal) { /*...*/ }, true); 

http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch देखें

कोणीय 1.1.x से आप उथले घड़ी देखने के लिए केवल $ वॉच कलेक्शन का उपयोग कर सकते हैं (केवल "प्रथम स्तर" का संग्रह)।

 $scope.$watchCollection('data', function (newVal, oldVal) { /*...*/ }); 

https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchCollection देखें

आपके $ वॉच में एक ऑब्जेक्ट गहरे डाइविंग के प्रदर्शन के परिणाम हैं कभी-कभी (उदाहरण के लिए, जब परिवर्तन केवल धक्का और पॉप होते हैं), तो आप शायद आसानी से गणना किए गए मान देख सकते हैं, जैसे कि array.length

यदि आप केवल एक सरणी को देखने जा रहे हैं, तो आप बस इस बिट कोड का उपयोग कर सकते हैं:

 $scope.$watch('columns', function() { // some value in the array has changed }, true); // watching properties 

उदाहरण

लेकिन यह कई सरणियों के साथ काम नहीं करेगा:

 $scope.$watch('columns + ANOTHER_ARRAY', function() { // will never be called when things change in columns or ANOTHER_ARRAY }, true); 

उदाहरण

इस स्थिति को संभालने के लिए, मैं आमतौर पर कई सरणियों को परिवर्तित करता हूं जो मैं JSON में देखना चाहता हूं:

 $scope.$watch(function() { return angular.toJson([$scope.columns, $scope.ANOTHER_ARRAY, ... ]); }, function() { // some value in some array has changed } 

उदाहरण

@ ज्ससेबास्टियन ने टिप्पणियों में बताया है, JSON.stringify को angular.toJson बेहतर पसंद किया जा सकता है क्योंकि यह उन सदस्यों को संभाल सकता है, जो कि '$' के साथ शुरू होता है और साथ ही संभव अन्य मामलों में भी।

यह ध्यान देने योग्य है कि अंगुल्य 1.1.x और इसके बाद के संस्करण में, आप $ watch के बजाय $ watch का उपयोग कर सकते हैं। यद्यपि $ वॉच संकलन उथले घड़ियों को बनाने में प्रतीत होता है, इसलिए यह आपके जैसे वस्तुओं की सरणियों के साथ काम नहीं करेगा यह सरणी में अतिरिक्त और विलोपन का पता लगा सकता है, लेकिन एरे के अंदर ऑब्जेक्ट के गुणों को नहीं।

$ watchCollection पूरा करता है कि आप क्या करना चाहते हैं नीचे एक उदाहरण है जो कोणीय की वेबसाइट http://docs.angularjs.org/api/ng/type/$rootScope.Scope से कॉपी किया जाता है, जबकि यह सुविधाजनक है, प्रदर्शन को विशेष रूप से ध्यान में रखा जाना चाहिए, जब आप बड़े संग्रह को देखते हैं।

  $scope.names = ['igor', 'matias', 'misko', 'james']; $scope.dataCount = 4; $scope.$watchCollection('names', function(newNames, oldNames) { $scope.dataCount = newNames.length; }); expect($scope.dataCount).toEqual(4); $scope.$digest(); //still at 4 ... no changes expect($scope.dataCount).toEqual(4); $scope.names.pop(); $scope.$digest(); //now there's been a change expect($scope.dataCount).toEqual(3); 

यहां तीन तरीकों की एक तुलना है जो आप उदाहरणों के साथ एक स्कोप वैरिएबल देख सकते हैं:

$ watch () द्वारा ट्रिगर किया गया है:

 $scope.myArray = []; $scope.myArray = null; $scope.myArray = someOtherArray; 

$ watchCollection () ऊपर और सब कुछ द्वारा ट्रिगर किया गया है:

 $scope.myArray.push({}); // add element $scope.myArray.splice(0, 1); // remove element $scope.myArray[0] = {}; // assign index to different value 

$ घड़ी (…, सच) ऊपर और सब कुछ से शुरू हो रही है:

 $scope.myArray[0].someProperty = "someValue"; 

बस एक और बात…

$ घड़ी () केवल एक है जो ट्रिगर होता है जब कोई सरणी दूसरे सरणी के साथ बदल जाती है, भले ही उस अन्य सरणी में एक ही सटीक सामग्री होती है

उदाहरण के लिए जहां $watch() आग $watchCollection() और $watchCollection() नहीं होगा:

 $scope.myArray = ["Apples", "Bananas", "Orange" ]; var newArray = []; newArray.push("Apples"); newArray.push("Bananas"); newArray.push("Orange"); $scope.myArray = newArray; 

नीचे एक उदाहरण JSFiddle के लिए एक लिंक है जो सभी विभिन्न घड़ी संयोजनों का उपयोग करता है और यह दर्शाता है कि कौन सी "घड़ियों" शुरू होती है, लॉग संदेशों को आउटपुट करती है:

http://jsfiddle.net/luisperezphd/2zj9k872/

यह समाधान मेरे लिए बहुत अच्छी तरह से काम किया है, मैं एक निर्देश में यह कर रहा हूं:

दायरा। $ watch (attrs.testWatch, function () {…..}, सच);

सही काम बहुत अच्छी तरह से और सभी chnages (जोड़ने, हटाने, या एक क्षेत्र को संशोधित) के लिए प्रतिक्रिया।

यहां इसके साथ खेलने के लिए एक कामयाबी हासिल है।

AngularJS में गहराई से एक सरणी देखना

मुझे आशा है कि यह आपके लिए उपयोगी हो सकता है यदि आपके कोई प्रश्न हैं, पूछने के लिए स्वतंत्र महसूस करें, तो मैं मदद करने की कोशिश करूंगा 🙂

मेरे मामले में, मुझे एक सेवा देखने की जरूरत थी, जिसमें कई अन्य नियंत्रकों द्वारा एक पता ऑब्जेक्ट भी देखा गया था। जब तक मैंने 'सच्चा' पैरामीटर जोड़ लिया, तब तक मैं एक पाश में फंस गया था, जो वस्तुओं की देखरेख में सफलता की कुंजी है।

 $scope.$watch(function() { return LocationService.getAddress(); }, function(address) { //handle address object }, true); 

objectEquality सेट करना $watch फ़ंक्शन के objectEquality पैरामीटर (तीसरा पैरामीटर) निश्चित रूप से सरणी के सभी गुण देखने का सही तरीका है।

 $scope.$watch('columns', function(newVal) { alert('columns changed'); },true); // <- Right here 

पिरान ने यह अच्छी तरह से जवाब दिया और $watchCollection उल्लेख किया।

ज्यादा जानकारी

इसका कारण है कि मैं पहले से ही उत्तर देने वाले प्रश्न का जवाब दे रहा हूं क्योंकि मैं कहना चाहता हूं कि विज़ार्डडडडन्ना का उत्तर अच्छा नहीं है और इसका इस्तेमाल नहीं किया जाना चाहिए।

समस्या यह है कि पचाने तुरंत नहीं होते हैं उन्हें निष्पादित करने से पहले कोड के मौजूदा ब्लॉक को पूरा होने तक इंतजार करना होगा। इस प्रकार, एक सरणी की length को देखते हुए वास्तव में कुछ महत्वपूर्ण परिवर्तनों को याद किया जा सकता है जो $watchCollection को पकड़ना होगा।

इस कॉन्फ़िगरेशन को मान लें:

 $scope.testArray = [ {val:1}, {val:2} ]; $scope.$watch('testArray.length', function(newLength, oldLength) { console.log('length changed: ', oldLength, ' -> ', newLength); }); $scope.$watchCollection('testArray', function(newArray) { console.log('testArray changed'); }); 

पहली नज़र में, ऐसा लग सकता है कि ये एक ही समय में आग लगेंगे, जैसे कि इस मामले में:

 function pushToArray() { $scope.testArray.push({val:3}); } pushToArray(); // Console output // length changed: 2 -> 3 // testArray changed 

यह अच्छी तरह से काम करता है, लेकिन इस पर विचार करें:

 function spliceArray() { // Starting at index 1, remove 1 item, then push {val: 3}. $testArray.splice(1, 1, {val: 3}); } spliceArray(); // Console output // testArray changed 

ध्यान दें कि परिणामस्वरूप लंबाई समान थी, हालांकि सरणी के पास एक नया तत्व है और एक तत्व खो दिया है, इसलिए देखने के रूप में $watch का संबंध है, length में बदलाव नहीं हुआ है। $watchCollection उस पर उठाया, यद्यपि।

 function pushPopArray() { $testArray.push({val: 3}); $testArray.pop(); } pushPopArray(); // Console output // testArray change 

एक ही परिणाम एक ही ब्लॉक में धक्का और पॉप के साथ होता है

निष्कर्ष

सरणी में हर प्रॉपर्टी देखने के लिए, तीसरे पैरामीटर (ऑब्जेक्ट ईक्वालिटी) में शामिल किए गए सरणी पर $watch उपयोग करें और सही पर सेट करें। हाँ, यह महंगा है लेकिन कभी-कभी आवश्यक है

जब ऑब्जेक्ट सरणी से बाहर / बाहर निकलते हैं, तो देखने के लिए, $watchCollection उपयोग करें।

सरणी की length संपत्ति पर $watch उपयोग न करें। लगभग ऐसा कोई अच्छा कारण नहीं है जिससे मैं ऐसा करने की सोच सकता हूं।

 $scope.changePass = function(data){ if(data.txtNewConfirmPassword !== data.txtNewPassword){ $scope.confirmStatus = true; }else{ $scope.confirmStatus = false; } }; 
  <form class="list" name="myForm"> <label class="item item-input"> <input type="password" placeholder="ใส่รหัสผ่านปัจจุบัน" ng-model="data.txtCurrentPassword" maxlength="5" required> </label> <label class="item item-input"> <input type="password" placeholder="ใส่รหัสผ่านใหม่" ng-model="data.txtNewPassword" maxlength="5" ng-minlength="5" name="checknawPassword" ng-change="changePass(data)" required> </label> <label class="item item-input"> <input type="password" placeholder="ใส่รหัสผ่านใหม่ให้ตรงกัน" ng-model="data.txtNewConfirmPassword" maxlength="5" ng-minlength="5" name="checkConfirmPassword" ng-change="changePass(data)" required> </label> <div class="spacer" style="width: 300px; height: 5px;"></div> <span style="color:red" ng-show="myForm.checknawPassword.$error.minlength || myForm.checkConfirmPassword.$error.minlength">รหัสผ่านต้องมีจำนวน 5 หลัก</span><br> <span ng-show="confirmStatus" style="color:red">รหัสผ่านใหม่ไม่ตรงกัน</span> <br> <button class="button button-positive button-block" ng-click="saveChangePass(data)" ng-disabled="myForm.$invalid || confirmStatus">เปลี่ยน</button> </form>