angularjs - निर्देशक परीक्षण में $ $ पाचन बनाम लागू करें





angularjs-directive (3)


जैसा कि प्रलेखन में उल्लेख किया गया है कि $ पाचन चक्र किसी भी समय $scope.$applyscope पर डेवलपर गाइड के अनुसार

अभिव्यक्ति का मूल्यांकन करने के बाद, $ आवेदन विधि एक $ पाचन करता है। $ पाचन चरण में दायरे सभी $ घड़ी अभिव्यक्तियों की जांच करता है और उन्हें पिछले मूल्य के साथ तुलना करता है।

और स्कोप एपीआई documentation

आमतौर पर आप नियंत्रक या निर्देशों में सीधे $ digest () को कॉल नहीं करते हैं। इसके बजाय $ लागू करने के लिए एक कॉल () (आमतौर पर निर्देशों के भीतर से) एक $ पाचन () को मजबूर करेगा।

इसलिए आपको $digest स्पष्ट रूप से कॉल नहीं करना चाहिए, आप $apply विधि को कॉल करना एक पाचन चक्र को ट्रिगर करेंगे।

अगर मेरे पास कोई निर्देश है जो दायरे पर किसी विशेष विशेषता की स्थिति का जवाब देता है, और मैं अपने परीक्षण में उस विशेषता को बदलना चाहता हूं और सत्यापित करता हूं कि यह सही ढंग से प्रतिक्रिया देता है, तो वह परिवर्तन करने का सबसे अच्छा तरीका कौन सा है?

मैंने इन दोनों पैटर्न को देखा है:

scope.$apply(function() {
    scope.myAttribute = true;
});

तथा

scope.myAttribute = true;
scope.$digest();

उनके बीच क्या अंतर है, और कौन सा बेहतर है और क्यों?




scope.$digest() मौजूदा दायरे पर और अपने सभी बच्चों पर भी नजर रखने वालों को आग लगाएगा। scope.$apply पारित समारोह का मूल्यांकन करेगा और $rootScope.$digest()

पहला व्यक्ति तेज़ है, क्योंकि इसे मौजूदा दायरे और उसके बच्चों के लिए वॉचर्स का मूल्यांकन करने की आवश्यकता है। दूसरा धीमा है, क्योंकि इसे $rootScope और उसके सभी बच्चे के स्कॉप्स के लिए $rootScope का मूल्यांकन करने की आवश्यकता है।

जब एक वॉचर्स में कोई त्रुटि होती है और आप scope.$digest उपयोग करते हैं scope.$digest , इसे $exceptionHandler सेवा के माध्यम से नहीं संभाला जाता है, इसलिए आपको अपवाद को संभालने की आवश्यकता है। scope.$apply आंतरिक रूप से एक try-catch ब्लॉक का उपयोग करता है और $exceptionHandler लिए सभी अपवादों को पास करता $exceptionHandler




=? प्रयोग करें =? निर्देश के दायरे ब्लॉक में संपत्ति के लिए ध्वज।

angular.module('myApp',[])
  .directive('myDirective', function(){
    return {
      template: 'hello {{name}}',
      scope: {
        // use the =? to denote the property as optional
        name: '=?'
      },
      controller: function($scope){
        // check if it was defined.  If not - set a default
        $scope.name = angular.isDefined($scope.name) ? $scope.name : 'default name';
      }
    }
  });






angularjs angularjs-directive