, परिवर्तन का पता लगाने के लिए कई तरीके हैं यह भी ChangeDetectionStrategyघटक में परिभाषित पर निर्भर करता है।
उपयोगी बस इसे क्योंकि सुपर शक्तिशाली होने के लिए, मैं इस सवाल का जवाब आसान बनाने और रिएक्टिव एक्सटेंशन पर ध्यान केंद्रित करेंगे (आरएक्स) ngModel निर्देश के साथ बातचीत का रास्ता, और कोणीय 2 परिवर्तन का पता लगाने के इंजन के साथ सबसे अच्छा एकीकरण है, प्रदर्शन के अनुसार।
सबसे पहले, हम पर जोर देना है कि NgModel तत्व का मूल्य के लिए बाध्य है और सभी परिवर्तनों को एक EventEmitter जो आप करने के लिए सदस्यता के माध्यम से प्रचारित कर रहे हैं की जरूरत है। EventEmitter एक कोणीय 2 प्रकार है जो एक आरएक्स विषय है जो मूल रूप से एक वस्तु है जो घटनाओं/डेटा को "प्रेषित" (उत्सर्जित) कर सकता है और "प्राप्त" डेटा पर भी प्रतिक्रिया दे सकता है। तो आरएक्स भूमि में इसका एक पर्यवेक्षक और पर्यवेक्षक है।
एनजीमोडेल पर "ngOnChanges" विधि का उल्लेख करने योग्य भी है जो परिवर्तन घटनाओं को संभालने के लिए हैंडलर प्राप्त करता है, लेकिन हम आरएक्स दृष्टिकोण पर ध्यान केंद्रित करेंगे।
तो, हमें उस पर्यवेक्षक तक पहुंच प्राप्त करने और इसकी सदस्यता लेने की आवश्यकता है, बढ़िया!
पहुंच प्राप्त करने के लिए हम निर्भरता इंजेक्शन का उपयोग करते हैं, यह घोषणा करके कि हम अपने निर्देश के निर्माता में NgModel प्राप्त करना चाहते हैं।
अब हमें सावधान रहने की भी आवश्यकता है, हमें यह सुनिश्चित करने की ज़रूरत है कि हम उस NgModel को प्राप्त करें अन्यथा हमें त्रुटियां होंगी।
हम इसे चुपचाप कर सकते हैं, एक निर्देश चयनकर्ता बनाने के द्वारा कि लागू करता है एक NgModel तत्व, जैसे: 'चयनकर्ता': '[myCustomDirective] [ngModel]', अब अगर ngModel तत्व यह जीता का हिस्सा नहीं है ' हमारे निर्देशक के चयनकर्ता से मेल नहीं खाते।
या, हम शोर कर सकते हैं और चुपचाप बाहर नहीं जा सकते हैं, हम निर्भरता इंजेक्शन को @Optional के रूप में चिह्नित करते हैं और यदि यह शून्य है तो हम एक स्पष्ट अपवाद फेंक सकते हैं कि क्या गुम है। यदि हम इसे @Optional कोणीय के रूप में चिह्नित नहीं करेंगे, तो लापता निर्भरता के बारे में एक सामान्य संदेश फेंक देगा, ठीक है लेकिन अच्छा नहीं है।
अब, एक उदाहरण:
import {Directive, Optional} from 'angular2/core';
import {NgModel}from 'angular2/common';
@Directive({
selector: '[myCustomDirective][ngModel]'
})
export class MyCustomDirective {
constructor(@Optional() public model: NgModel) {
if (!model)
throw new Error ("myCustomDirective requires ngModel.");
// this code should be in a designated functions...
// register to incoming changes to the model
// we can also transform values..., for example take only distinct values...
// this.model.update.distinctUntilChanged()...
let subscription = this.model.update.subscribe((newValue) => {
// Changes happen here, do something with them...
// note that the value of this.model is still the old value
// The local parameter "newValue" holds the new value.
});
// We can also change the value of the model:
this.model.update.emit('something...');
}
}
आशा है कि मदद की।
thankyou, लेकिन जैसा कि कहा गया है, मैं निर्देश इस परिवर्तन का पता लगाने के, को जोड़ने के लिए है नहीं करना चाहता पाठ क्षेत्र –
के HTML कोड इस ही काम करता है अगर आप, पाठ क्षेत्र में लिख रहे हैं, तो एक और पाठ क्षेत्र से मॉडल परिवर्तन है कि एक ही मॉडल के लिए बाध्य है नहीं। –
यदि "ग्राहक टेक्स्ट" एक '@ इनपुट() 'है? को लागू करने 'ngModelChange (परिवर्तन)' अपने निर्देश में और परिवर्तन के लिए प्रतिक्रिया करने के लिए आप क्या चाहते हैं क्या करना चाहिए आपकी कोड जोड़ने। –