2016-12-15 12 views
12

के माध्यम से बनाए गए फॉर्मकंट्रोल तक पहुंचने का निर्देश है, इसलिए मैं एक निर्देश बनाने की कोशिश कर रहा हूं जो फॉर्मकंट्रोल में हेरफेर कर सकता है।कोणीय 2 v.2.3 - निर्देश का उपयोग फॉर्मकंट्रोलनाम सिंटैक्स

ऐसा लगता है कि यदि मैं टेम्पलेट में फॉर्म नियंत्रण घोषित करने के लिए लंबे वाक्यविन्यास का उपयोग करता हूं, तो मैं इसे सीधे @ इनपुट() बाइंड के रूप में सामग्री के साथ करने के निर्देश पर नियंत्रण पास कर सकता हूं; अर्थात्:

<form [formGroup]="myForm"> 
    <input type="text" id="myText" [formControl]="myForm.controls['myText']" my-directive> 
</form> 

और निम्न घटक तर्क: निम्नलिखित टेम्पलेट के साथ

@Component({ 
    // Properties go here. 
}) 
class MyComponent { 
    myForm: FormGroup; 

    constructor(fb: FormBuilder) { 
     // Constructor logic... 
    } 

    ngOnInit() { 
     this.myForm = this.fb.group({ 
      "myText": [""] 
     }); 
    } 
} 

निर्देश लगेगा जैसे:

@Directive({ 
    selector: "[my-directive]" 
}) 
class MyDirective { 
    Input() formControl: FormControl; 
} 

लेकिन अगर मैं में formControlName सिंटैक्स का उपयोग कर रहे थे इसके बजाय टेम्पलेट:

<form [formGroup]="myForm"> 
    <input type="text" id="myText" formControlName="myText" my-directive> 
</form> 

मैं निर्देश में फॉर्मकंट्रोल (अंतर्निहित?) का संदर्भ कैसे दूंगा?

+0

यह स्पष्ट नहीं है कि तुम क्या पूछ रहे हैं में। आप टेम्प्लेट बाध्यकारी, 'formControlName = "someName" 'या' [formControl] = "myForm.controls [' someName ']" के करीब एक प्रतिक्रियाशील इनपुट के लिए एक निर्देश लागू कर सकते हैं जैसा कि मैं कह सकता हूं कि यह नहीं करता है एक अंतर। यदि आप अपना निर्देश पोस्ट करते हैं और यह आपके लिए क्यों काम नहीं कर रहा है तो शायद आपको जवाब मिल सकता है। – silentsod

+0

जहां तक ​​मुझे पता है, formControlName वाक्यविन्यास तत्व पर FormControl उदाहरण नहीं रखता है, इसलिए एक स्पष्ट बाध्यकारी के बिना, मुझे नहीं पता कि इसे कैसे एक्सेस किया जाए। मैंने सवाल संपादित कर लिया है, उम्मीद है कि यह और स्पष्ट है। –

उत्तर

25

आप NgControl, ElementRef, HostListener और निर्माता इंजेक्शन का उपयोग अगर हम एक निर्देश लागू या तो formControlName या [formControl] आड़ और यहां तक ​​कि टेम्प्लेट संचालित रूपों में प्रतिक्रियाशील रूपों से नियंत्रण के रूप में हो सकता है:

import { Directive, ElementRef, HostListener } from "@angular/core"; 
import { NgControl } from "@angular/forms"; 

@Directive({ 
    selector: '[my-directive]' 
}) 
export class MyDirective { 
    constructor(private el: ElementRef, private control : NgControl) { } 

    @HostListener('input',['$event']) onEvent($event){ 
    let valueToTransform = this.el.nativeElement.value; 
    // do something with the valueToTransform 
    this.control.control.setValue(valueToTransform); 
    } 
} 

यहाँ एक applicable demo

है
+0

धन्यवाद, NgControl के बारे में पता नहीं था। बस समझने के लिए ... 1) यह.control एक फॉर्मकंट्रोल डायरेक्टिव, एक फॉर्मकंट्रोलनाम निर्देश, या एक NgModel निर्देश के आधार पर मूल्यांकन करेगा हालांकि हम फॉर्म बना रहे हैं? 2) this.control.control इस.control द्वारा प्रयुक्त FormControl उदाहरण है, और 1 में सूचीबद्ध निर्देश) क्या यह सब है? 3) इस.control.control में परिवर्तन इस.control पर लागू होगा? (उदाहरण के लिए यह.control.control.markAsPristine() इस.control.pristine को सत्य पर सेट करेगा?) –

+0

1) सही, 2) यह भी सही है कि जब आप नियंत्रण को तुरंत चालू करते हैं तो यह निर्देशक कन्स्ट्रक्टर में अनिर्धारित हो सकता है (जो है अजीब, लेकिन जीवन चक्र घटनाओं से संबंधित) 3) हां। – silentsod

+0

यह तब काम नहीं करता है जब कोई निर्देशक एक सत्यापनकर्ता के रूप में भी कार्य करता है। यह चक्रीय निर्भरता का कारण बनता है। –

2

@silentsod उत्तर बेकार ढंग से काम करेगा।

1. यदि आपको कुंजी-प्रेस अप/डाउन या किसी अन्य ईवेंट जैसे कई ईवेंट प्रबंधित करने की आवश्यकता है, तो आप नीचे के दृष्टिकोण के साथ जा सकते हैं।
2. साथ ही, निर्देशों में घटनाओं को परिभाषित करना बेहतर है।

import { Directive, ElementRef} from "@angular/core"; 
import { NgControl } from "@angular/forms"; 

@Directive({ 
    selector: '[my-directive]', 
    host: { 
    '(input)':'onEvent($event)', 
    '(keydown.backspace)': 'onEvent($event, true)' 
}) 
export class MyDirective { 
    constructor(private el: ElementRef, private control : NgControl) { } 

    public onEvent($event, someEvent){ 
    let valueToTransform = this.el.nativeElement.value; 
    // do something with the valueToTransform 
    if(someEvent) { 
    //do something 
    } 
    this.control.control.setValue(valueToTransform); 
    } 
} 

एचटीएमएल

<form [formGroup]="myForm"> 
<input type="text" id="myText" formControlName="myText" my-directive> 
</form> 
संबंधित मुद्दे