2013-02-12 20 views
23

के साथ नहीं बदलता है, मैं कोणीय जेएस प्रिस्टिन सेटिंग का परीक्षण करके बटन की सक्षम/अक्षम विशेषता जैसे फॉर्म आइटमों का प्रदर्शन समायोजित करना चाहता हूं।

जब एक क्लिक इवेंट फ़ायर करता है तो फॉर्म का प्रिस्टिन वैल्यू बदल जाता है जैसा कि मैं अपेक्षा करता हूं लेकिन जब मैं स्कोप वैरिएबल में हेरफेर करता हूं तो फॉर्म की प्रिस्टिन सेटिंग बदल नहीं जाती है, भले ही फॉर्म पर नियंत्रण उस चर के लिए बाध्य हो।

कृपया निम्न JSfiddle:

http://jsfiddle.net/nicholasporter/2h7wT/3/

मुझे लगता है कि बूलियन मान के फेरबदल रूपों प्राचीन सेटिंग के कारण बदलने के लिए होता है जब एक नियंत्रण एक गुंजाइश चर के लिए बाध्य है उम्मीद करेंगे। क्या इसका परीक्षण करने का कोई बेहतर तरीका है? क्या फॉर्म पर कुछ भी नहीं बदला है जब बटन या अन्य डीओएम तत्वों को समायोजित करने का कोई बेहतर तरीका है? किसी भी पॉइंटर्स के लिए अग्रिम धन्यवाद। JSFiddle काम नहीं कर रहा है, तो कोड यहां दिया गया है।

<div ng-app ng-controller="MyCtrl"> 
    <form novalidate name="myForm"> 
    {{myBool}} 

     <input type="checkbox" ng-model="myBool" /> 
     <button ng-click="myBool=!myBool">JS set</button> 
     <div>Form Pristine:{{myForm.$pristine}}</div> 
    </form> 
    </div> 


<script> 
    function MyCtrl($scope){ 
     $scope.myBool = false; 
    } 
</script> 
+1

1.0.4 में प्रकट होता है –

उत्तर

27

एक ng-model निर्देश के साथ एक एक इनपुट के $pristine प्रॉपर्टी केवल तभी जब इसकी ngModelControllers $setViewValue() विधि का इस्तेमाल किया जाता है, कि इनपुट तत्व पर उपयोगकर्ता संपर्क के माध्यम से या उस विधि अपने आप को फोन करके है बदल जाता है।

ऐसा इसलिए है क्योंकि प्राचीन राज्य का उपयोग आपके द्वारा परिवर्तित किए गए गीलेर का ट्रैक रखने के लिए किया जाता है (फॉर्म में किसी भी ng-model-सक्षम इनपुट तत्वों में संशोधित)। इसका मतलब यह नहीं है कि इनपुट में मान मॉडल के मानों के बराबर हैं, वे हमेशा प्रत्येक कीस्ट्रोक के बाद अपडेट होते हैं! प्रिस्टिन के लिए एक फॉर्म रीसेट करने का कोई स्वचालित तरीका नहीं है, आपको form.$setPristine() पर कॉल करके ऐसा करने का निर्णय लेना होगा।

आप अपने उदाहरण में प्राचीन जानकारी रीसेट करना चाहते हैं, तो आप गुंजाइश पर एक समारोह के लिए बटन जुड़ कर खुद को रीसेट करने के रूप में बताने के लिए है:

$scope.toggleBool = function() { 
    $scope.myBool = !$scope.myBool; 
    $scope.myForm.$setPristine(); 
} 

तो आपको एक अलग करना चाहते हैं फ़ॉर्म के लिए मानों का सेट और ऑब्जेक्ट की मूल स्थिति के लिए, आपको ऑब्जेक्ट क्लोन करना होगा और फिर फॉर्म में क्लोन का उपयोग करना होगा। अन्यथा सभी परिवर्तन हमेशा मूल वस्तु को तुरंत बदल देते हैं।

फिर आप मूल वस्तु और उसके क्लोन के बीच गहरी तुलना करके फ़ॉर्म की स्थिति निर्धारित कर सकते हैं।

अद्यतन मई '15: इस सवाल का जवाब 2013 से ngModelController कोणीय (वर्तमान में 1.4), उस प्रपत्र राज्य के प्रबंधन के लिए कुछ तंत्र प्रदान करता है के हाल के संस्करणों में एक significantly richer API प्राप्त की है है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद जो इसे एक टन साफ़ करता है! – likestoski

+0

मुझे खेद है, $ setViewValue() के साथ स्निपेट क्या है? –

+0

@EliseChant क्षमा करें, मैं आपके प्रश्न को समझ नहीं पा रहा हूं। क्या आप विस्तार से समझा सकते हैं? – Jan