2016-02-06 21 views
9

Provo a utilizzare un servizio in un validatore personalizzato per verificare se esiste già un nome utente.Iniettare un servizio in un validatore personalizzato in 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; 
    } 
} 

Non funziona. In characterNameValidator, "this" fa riferimento al controllo e non alla mia classe. Il servizio non è definito. Come posso usare il mio servizio nel validatore?

Più globalmente, come posso passare argomenti in un validatore personalizzato?

risposta

6

È necessario controllare che cosa significa this durante la convalida. È possibile farlo con bind

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

Tutto il resto dovrebbe funzionare come previsto allora.

+0

Funziona perfettamente, grazie. – Kelem

+1

potresti anche usare una funzione freccia per mantenere questo puntamento all'oggetto giusto. – toskv

+0

@SnareChops - Puoi collegare per favore dove è presente "legatura" è documentato? Non riesco a trovare nulla di utile. –

4

È possibile utilizzare una funzione freccia per mantenere il contesto lo stesso.

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

E i parametri di validazione? Il modulo passerà 'control' alla funzione freccia, che viene ignorata, e quindi' characterNameValidator' non riceverà mai il parametro. Se aggiunto nella lista degli argomenti della funzione freccia e poi passato al validatore, allora quello risolverebbe il problema, ma cosa fa effettivamente questo passo in più rispetto al passaggio del validatore come riferimento a una funzione associata? – SnareChops

+0

Ho aggiunto i parametri. Inoltre, poiché il metodo characterNameValidator restituisce qualcosa, puoi semplicemente eliminare il blocco all'interno della funzione freccia. – toskv

Problemi correlati