2015-06-15 10 views
9

मुझे समस्या है जब मॉडल को प्रोग्रामेटिक रूप से बदलते समय कोणीय के एनजी-चेंज को कॉल किया जाता है। http://plnkr.co/edit/R4MO86ihMrauHXhpCMxi?p=previewngChange को तब कहा जाता है जब मॉडल प्रोग्रामेटिक रूप से बदलता है

संदेश, अशक्त होना चाहिए क्योंकि sendMessage नहीं कहा जाना चाहिए:

$scope.sendMessage = function() { 
    $scope.message = "Message sent"; 
} 

$scope.confirmed = true; 
$scope.mySelectBox = $scope.selects[1]; 

<select ng-model="mySelectBox" 
     ng-options="item.name for item in selects track by item.name" 
     ng-change="sendMessage()"> 
</select> 

यहाँ कोड उदाहरण है। मॉडल प्रोग्रामेटिक रूप से बदल दिया गया है।

+2

एचएम, यह 'ng-select' intializing के तरीके से कुछ अजीब हो सकता है। 'Ng-change' अपेक्षित रूप से काम करता है और जब इंटिलाइजेशन के बाद प्रोग्रामेटिक रूप से ड्रॉपडाउन मान बदल जाता है तो आग नहीं होती है। मैंने आपके डेमो के आधार पर [एक पहेली] (http://jsfiddle.net/twn347d3/) बनाया है। – ryanyuyu

+0

हाँ, बहुत अजीब। शायद एक मुद्दे के रूप में रिपोर्ट किया जा सकता है? –

+0

हैलो, मुझे किसी अन्य संदर्भ में एक ही तरह का मुद्दा सामना करना पड़ रहा है जब HTTP अनुरोध के माध्यम से एकत्रित मूल्यों के साथ प्रोग्रामेटिक रूप से मॉडल बदलना (नीचे लिंक देखें)। क्या आपको कोई समाधान मिला या आपने गिटहब में कोणीय जेएस टीम को बग घोषित किया? TIA। [यहां देखें] (http://stackoverflow.com/questions/31464323/setting-scope-mymodel-element-with-ng-change-enters-in-infinite-loop)। –

उत्तर

3

डॉक्स के अनुसार, तुम सही हो।

https://docs.angularjs.org/api/ng/directive/ngChange

लेकिन यह एक बग जिस क्रम में घटनाओं यह दौर

सबसे अच्छा तरीका है को झुका कर रहे हैं की वजह से किया जा रहा है - js हैंडलर का सहारा के साथ (onchange)

$scope.$watch("mySelectBox", function(a,b) { 
    if (a.name!=b.name) { 
     $scope.message = "Message sent! (old="+b.name+', new='+a.name+')'; 
    } 
    }); 

देखें फेंकना http://plnkr.co/edit/2ZbxS1tszppR9SrNqxVB?p=preview

HTH

+०१२३५१६४१०६१
+0

$ स्पर्श अच्छी तरह से काम करता है (@tomek) – sambomartin

+2

यदि 'ट्रैक बाय' हटा दिया गया है तो यह अपेक्षित काम करता है। तो जैसा कि आपने एक बग कहा ... – user1821052

+0

जानना अच्छा है, धन्यवाद – sambomartin

0

आप मूल्य प्रदान कर रहे हैं नियंत्रक में मॉडल करने के लिए है, इसलिए जब भी आप जो सूची के साथ मिलान किया जाता है मॉडल का मान सेट होगा यह एनजी-परिवर्तन कॉल करेगा:

अद्यतन plunker देखें: http://plnkr.co/edit/f3xGmKesLFbzti56WLyH?p=preview

+2

यह उस प्रश्न का उत्तर नहीं है। – kTT

3

एनजी प्रत्येक मॉडल परिवर्तन पर कॉलबैक बदल दिया जाता है, और यह प्रारंभिक सेटअप को इस तरह के परिवर्तन के रूप में मानता है। आप जो करना चाहते हैं वह वांछित कोड चलाने के लिए है जब उपयोगकर्ता इसके साथ इंटरैक्ट करता है। आप देख सकते हैं $ क्षेत्र के संपत्ति को छुआ:

<form name="exampleForm" ng-controller="ExampleController"> 
    <select ng-model="mySelectBox" name="mySelectBox" 
      ng-options="item.name for item in selects track by item.name" 
      ng-change="sendMessage()"> 
    </select> 
    <p>message = {{message}}</p> 
</form> 


$scope.sendMessage = function() { 
    if ($scope.exampleForm.mySelectBox.$touched) { 
     $scope.message = "Message sent"; 
    } 
} 
12

आप ngModelOptions के साथ प्रयास कर सकते हैं। संदर्भ http://plnkr.co/edit/BdKx62RW5Ls2Iz1H3VR1?p=preview के लिए इस प्लंकर को देखें।

मेरे उदाहरण में मैंने ng-model-options="{ updateOn: 'change', debounce: { change: 0 } }" का उपयोग किया और ऐसा लगता है। जब मैं चयन बदलता हूं तो यह केवल ngChange में प्रदान किया गया फ़ंक्शन चलाता है। प्रारंभिक चरण message खाली रहता है।

+1

यह सही उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि आपको एनजी-चेंज द्वारा बुलाए जाने वाले फ़ंक्शन को संशोधित करने के लिए मजबूर नहीं किया गया है। धन्यवाद! –

संबंधित मुद्दे