Angular2 में फॉर्म वैलिडेटर कैसे ट्रिगर करें


82

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

उदाहरण: चेकबॉक्स एक्स और इनपुट पी। इनपुट पी में एक सत्यापनकर्ता है जो एक्स के मॉडल मूल्य के आधार पर अलग तरह से व्यवहार करता है। जब एक्स की जांच की जाती है / अनियंत्रित होती है तो मुझे पी पर सत्यापनकर्ता को आमंत्रित करने की आवश्यकता होती है। पी पर मान्यकर्ता मॉडल को देखेगा। X की स्थिति निर्धारित करें और तदनुसार P को मान्य करेगा।

यहाँ कुछ कोड है:

constructor(builder: FormBuilder) {
    this.formData = { num: '', checkbox: false };

    this.formGp = builder.group({
        numberFld: [this.formData.num, myValidators.numericRange],
        checkboxFld: [this.formData.checkbox],
    });
}

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
        // I want to be able to do something like the following line:
        this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']);
    }
});

किसी के पास कोई हल है? धन्यवाद!


क्या आप केवल X के मान के आधार पर सत्यापन को सक्षम / अक्षम करने का प्रयास कर रहे हैं? आप किस प्रकार के सत्यापनकर्ताओं का उपयोग कर रहे हैं? आप सत्यापनकर्ताओं को अपने दायरे में एक शर्त के आधार पर निष्पादित करने का कारण बन सकते हैं, लेकिन मुझे यकीन नहीं है कि यह दृष्टिकोण आपके लिए काम करेगा। देखें: stackoverflow.com/questions/21370006/…
stephen.vakil

@ stephen.vakil - मैं कोणीय 2 का उपयोग कर रहा हूं।
बोनेविले

@Boneville क्या आप बता सकते हैं कि आप सत्यापनकर्ता फ़ंक्शन को चेकबॉक्स राज्य कैसे दे रहे हैं?
वरुण मुलोली

जवाबों:


79

मुझे नहीं पता कि क्या आप अभी भी उत्तर की तलाश में हैं, इसलिए यहाँ मेरे सुझाव हैं:

इस पर एक नज़र: कोणीय 2 - AbstractControl

मुझे लगता है कि आप क्या कर सकते हैं:

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
       this.formGp.controls['numberFld'].updateValueAndValidity();
    }
});

यह सत्यापनकर्ताओं को ट्रिगर और चलाना चाहिए। इसके अलावा राज्य के रूप में अच्छी तरह से अद्यतन हो जाता है। अब आपको अपने सत्यापनकर्ता तर्क के भीतर चेकबॉक्स मान से परामर्श करने में सक्षम होना चाहिए।

उम्मीद है की यह मदद करेगा!

संपादित करें: अद्यतन लिंक और उदाहरण। जब मैं अपना उत्तर लिख रहा था तब कोड बदल गया।

EDIT_2: Alpha.48 ने EventEmitter.observer को EventEmitter.subscribe में बदल दिया!

EDIT_3: वास्तविक कार्यान्वयन के लिए परिवर्तित लिंक, दस्तावेज़ों के लिए लिंक जोड़ा गया

वैलिडटन-गाइड

FormControl प्रलेखन


धन्यवाद @ सुझाव के लिए धन्यवाद, मैं इसे आज़माऊँगा। ध्यान दें कि आपका लिंक काम नहीं कर रहा है।
बोन्नेविले

@Bonneville जानकारी के लिए धन्यवाद। उन्होंने फॉर्म कोड को सामान्य नेमस्पेस पर निकाला। चीजें तेजी से बदल रही हैं :)। मैंने स्रोत का लिंक अपडेट कर दिया है।
रात

मैं अंत में कोड के इस टुकड़े का उपयोग करने के लिए मिला और यह मेरे लिए काम कर रहा है। धन्यवाद! BTW, आपके कोड में एक टाइपो है: पत्र 'e' अपडेटवैल्यूएंडवैलिडिटी () फ़ंक्शन में गायब है। आपके कोड में अपडेट के बजाय अपडेट है। चीयर्स, यह एक बड़ी मदद थी!
बोनेविले

1
लिंक टूट गया है; इसे github.com/angular/angular/blob/master/packages/forms/src/… से अपडेट किया जा सकता है, हालांकि यह समान नहीं है। कोणीय डॉक्स से भी लिंक कर सकता है
विस्फोट गोलियां

1
जीवन रक्षक !! उपयोग केस जो मैं अटका हुआ था, जब उपयोगकर्ता एक फॉर्म नियंत्रण को छूने के बिना एक फॉर्म सबमिट करता है। फॉर्म अमान्य है, लेकिन नियंत्रण जहां कोई त्रुटि संदेश नहीं दिखा रहा है
प्रवीण

43

अपने ControlGroup के साथ मैं ऐसा करता हूं क्योंकि मेरे पास त्रुटियां हैं, अगर छुआ गया तो चेकिंग में divs है

for (var i in this.form.controls) {
  this.form.controls[i].markAsTouched();
}

(this.form मेरा कंट्रोलग्रुप है)


यह वास्तव में सही उत्तर है। यदि आप सिंगल इनपुट चाहते हैं तो इस.नियंत्रण ['नाम']। MarkAsTouched ();
चिर_र।

19

इस ब्लॉग की मदद से

ब्लॉग लिंक

मैं नाइटकिंग उत्तर के संयोजन के साथ एक समाधान भर में आया हूं

Object.keys(this.orderForm.controls).forEach(field => {
       const control = this.orderForm.get(field);
       control.updateValueAndValidity();

});

this.orderForm प्रपत्र समूह है



6

इस व्यवहार के मॉडलिंग के और अधिक सुरुचिपूर्ण तरीके हैं - उदाहरण के लिए, अपने राज्य को एक रिप्लेस्जेक्ट में डालकर और उस पर गौर करते हुए, और फिर राज्य का अवलोकन करते हुए async सत्यापनकर्ताओं का उपयोग करते हुए - लेकिन नीचे दिया गया छद्म-कूट दृष्टिकोण काम करना चाहिए। आप बस चेकबॉक्स में मूल्य परिवर्तन का निरीक्षण करते हैं, मॉडल को उचित रूप से अपडेट करते हैं, फिर अपडेटवैल्यूएंडवैलिडिटी कैल के साथ नंबरफल्ड की पुन: मान्यता को मजबूर करते हैं।

constructor(builder: FormBuilder) {
  this.formData = { num: '', checkbox: false };
  const numberFld = builder.control(this.formData.num, myValidators.numericRange);

  const checkbox = builder.control(this.formData.checkbox);
  checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => {
    this.formData.checked = bool;
    numberFld.updateValueAndValidity(); //triggers numberFld validation
  });

  this.formGp = builder.group({
      numberFld: numberFld,
      checkboxFld: checkbox
  });
}

0
static minMaxRange(min: number, max: number): ValidatorFn {
    return (control: AbstractControl): ValidationErrors | null => {
        if (Validators.min(min)(control)) { // if min not valid
            return Validators.min(min)(control);
        } else {
            return Validators.max(max)(control);
        }
    };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.