2016-02-06 21 views
9

में एक कस्टम सत्यापनकर्ता में एक सेवा इंजेक्ट करें मैं एक वैध सत्यापनकर्ता में एक सेवा का उपयोग करने की कोशिश करता हूं यह जांचने के लिए कि कोई उपयोगकर्ता नाम पहले से मौजूद है या नहीं।Angular2

import {Component} from 'angular2/core'; 
import { 
    Control, 
    ControlGroup, 
    FormBuilder 
} from "angular2/common"; 
import {CharacterService} from "./character-service"; 

@Component({ 
    selector: 'register-character-form', 
    template: ` 
     <h2 class="ui header">A new adventurer is coming...</h2> 
     <form (ngSubmit)="register()" [ngFormModel]="characterForm" class="ui form"> 
      <div class="field"> 
       <label>Nom</label> 
       <input ngControl="name"> 
      </div> 
      <button type="submit" class="ui button">Enter in the adventure</button> 
     </form> 
    `, 
    providers: [CharacterService] 
}) 
export class RegisterCharacterFormCmp { 
    characterForm: ControlGroup; 
    name: Control; 

    constructor(private _characterService: CharacterService, fb: FormBuilder) { 
     this.name = fb.control('', this.characterNameValidator); 

     this.characterForm = fb.group({ 
      name: this.name 
     }); 
    } 

    register(): void { 
     //TODO: To implement 
    } 

    // Not works, this binds the control 
    characterNameValidator(control: Control) { 
     return this._characterService.isCharacterNameAlreadyExists(control.value) ? {nameCharacterAlreadyExistsError: true} : null; 
    } 
} 

यह काम नहीं करता है। वर्णनाम वैलिडेटर में, 'यह' नियंत्रण का संदर्भ देता है, न कि मेरी कक्षा। सेवा अपरिभाषित है। मैं वैधता में अपनी सेवा का उपयोग कैसे कर सकता हूं?

अधिक वैश्विक स्तर पर, मैं एक कस्टम सत्यापनकर्ता में तर्क कैसे पारित कर सकता हूं?

उत्तर

6

आपको अपने सत्यापन में this का अर्थ नियंत्रित करने की आवश्यकता है। आप के साथ bind

this.name = fb.control('', this.characterNameValidator.bind(this)); 

बाकी सब कुछ ऐसा करने के रूप में तो उम्मीद से काम करना चाहिए कर सकते हैं।

+0

यह पूरी तरह से काम करता है, धन्यवाद। – Kelem

+1

आप इस ऑब्जेक्ट को सही ऑब्जेक्ट पर रखने के लिए तीर फ़ंक्शन का भी उपयोग कर सकते हैं। – toskv

+0

@SnareChops - क्या आप कृपया लिंक कर सकते हैं कि यह कहां है 'बाइंड' दस्तावेज है? मुझे कुछ भी उपयोगी नहीं लग रहा है। –

4

आप संदर्भ को रखने के लिए एक तीर फ़ंक्शन का उपयोग कर सकते हैं।

this.name = fb.control('', (control: Control) => this.characterNameValidator(control)); 
+0

सत्यापन मानकों के बारे में क्या? फॉर्म 'नियंत्रण' को तीर फ़ंक्शन पर पास कर देगा, जिसे अनदेखा किया जाता है, और फिर 'characterNameValidator' को पैरामीटर कभी प्राप्त नहीं होगा। यदि तीर फ़ंक्शन की तर्क सूची में जोड़ा गया है और फिर सत्यापनकर्ता को पास किया गया है, तो वह उस समस्या को हल करेगा, हालांकि यह अतिरिक्त चरण वास्तव में सत्यापनकर्ता को बाध्य फ़ंक्शन संदर्भ के रूप में पारित करने की तुलना में क्या करता है? – SnareChops

+0

मैंने पैरामीटर जोड़े। चूंकि वर्णनाम वैलिडेटर विधि कुछ देता है, इसलिए आप तीर फ़ंक्शन के अंदर ब्लॉक से दूर हो सकते हैं। – toskv