javascript - एनजीएमडेल के साथ कोणीय निर्देशों में फ़ॉर्मेटर चेन को कैसे पुन: चलाएं?



angularjs angularjs-directive (1)

Angular.js ngModel में पार्सर्स और फॉर्मैटर्स की श्रृंखला घोषित करने की क्षमता है। कुछ अधिक विवरण 'एंजुलर.जेएस में दो-तरफ़ा फ़िल्टरिंग करने के तरीके' के महान उत्तर पर पाए जा सकते हैं ।

अब formatter श्रृंखला केवल अगर ngModel अद्यतन करेगा चलाने के लिए किया जाएगा। इसलिए यदि आपके पास एक दूसरा इनपुट-पैरामीटर है जो viewValue को प्रभावित करता है (फ़ॉर्मेटर्स में से किसी एक में उपयोग किया जाता है) यह दृश्य के अपडेट को ट्रिगर नहीं करेगा जैसे ही मैंने पाया कि एनजी मॉडेल केवल एक सरल $ वॉच का उपयोग करता है - इसलिए यदि आपका मॉडल संग्रह / ऑब्जेक्ट है तो उप-तत्व बदल दिए जाने पर यह ट्रिगर नहीं होगा।

NgModel के लिए एक गहरी घड़ी को लागू करने का सबसे अच्छा तरीका क्या है -
या एक अतिरिक्त पैरामीटर के लिए एक घड़ी जो कि फॉर्मेटर चेन को फिर से चलाया जा सकता है?

अन्य समान प्रश्न हैं:
Angularjs: कैसे कुछ सेटिंग बदल जाती है जब $ formatters "फिर से चलाना"?


वर्तमान में आंतरिक फॉर्मेटर श्रृंखला को कॉल करने के लिए कोई प्रत्यक्ष एपीआई नहीं है। इस के लिए एक गिथूब फीचर अनुरोध है जैसा कि आप के आस-पास काम करते हैं, वह सिर्फ आंतरिक कोड कॉपी कर सकते हैं:

function runFormatters(ctrl){
    // this function is a copy of the internal formatter running code.
    // https://github.com/angular/angular.js/issues/3407#issue-17469647

    var modelValue = ctrl.$modelValue;

    var formatters = ctrl.$formatters;
    var idx = formatters.length;

    var viewValue = modelValue;

    while (idx--) {
        viewValue = formatters[idx](viewValue);
    }

    if (ctrl.$viewValue !== viewValue) {
        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
        ctrl.$render();

        ctrl.$$runValidators(modelValue, viewValue, angular.noop);
    }

}

यह प्लंकर अतिरिक्त पैरामीटर के लिए एक घड़ी के साथ संयोजन में उपयोग को दर्शाता है:

// deepwatch all listed attributes
scope.$watch(
    function(){
        return [scope.extraThingToWatchFor, scope.someOther];
    },
    function() {
        console.log("\t runformatters()");
        runFormatters();
    },
    true
);

यह ngmodel पर गहराई से प्रदर्शित करने के लिए एक दूसरा प्लंकर है

// deepwatch ngModel
scope.$watch(
    function(){
        return ngModelCtrl.$modelValue;
    },
    function(newData) {
        runFormatters(ngModelCtrl);
    },
    true
);




html-input