2016-10-29 1 views
7

ich das folgende Formular in angular2 erstellt bekommen:@ViewChild Mit ‚undefined‘ Halt des .nativeElement eines Eingangs kehrt

import {Component, ElementRef, ViewChild, AfterViewInit} from "angular2/core"; 
import {Observable} from "rxjs/Rx"; 
import {ControlGroup, Control, Validators, FormBuilder} from "angular2/common"; 

@Component({ 
    selector: "ping-pong", 
    template: ` 
        <form 
        name="someform"        [ngFormModel]="form"> 
         <div class="form-group"> 
          <input         
           id="foobar"      #foobar="ngForm" <-- without ="ngForm" everything works fine 
           type="text"      ngControl="foobar" 
           value="" 
           class="form-control" 
          /> 
         </div> 
        </form> 
       `, 
    styles: [` 
        form { 
         width: 300px; 
        } 
       `] 
}) 

export class ChangepswdFormComponent implements AfterViewInit { 
    @ViewChild("foobar") foobar: ElementRef; 
    private form: ControlGroup; 

    public constructor(formBuilder: FormBuilder) { 
     this.form = formBuilder.group({ 
      foobar: [""] 
     }); 
    } 

    public ngAfterViewInit(): void { 
     console.log(this.foobar.nativeElement); 
     //observable doesnt work because nativeelement is undefined 
     //Observable.fromEvent(this.foobar.nativeElement, "keyup").subscribe(data => console.log(data)); 
    } 
} 

Innen ngAfterViewInit die nativeElement Bit ist nicht definiert, es sei denn ich die = „ngForm“ entfernen Teil aus #foobar = „ngForm“ .I wand dieses Problem durch die folgenden Verbesserungen machen:

import {Component, ElementRef, ViewChild, AfterViewInit} from "angular2/core"; 
import {Observable} from "rxjs/Rx"; 
import {ControlGroup, Control, Validators, FormBuilder} from "angular2/common"; 

@Component({ 
    selector: "ping-pong", 
    template: ` 
        <form 
        name="someform"        [ngFormModel]="form"> 
         <div class="form-group"> 
          <input         
           id="foobar"      #foobar="ngForm"  #tralala 
           type="text"      ngControl="foobar" 
           value="" 
           class="form-control" 
          /> 
         </div> 
        </form> 
       `, 
    styles: [` 
        form { 
         width: 300px; 
        } 
       `] 
}) 

export class ChangepswdFormComponent implements AfterViewInit { 
    @ViewChild("tralala") foobar: ElementRef; 
    private form: ControlGroup; 

    public constructor(formBuilder: FormBuilder) { 
     this.form = formBuilder.group({ 
      foobar: [""] 
     }); 
    } 

    public ngAfterViewInit(): void { 
     console.log(this.foobar.nativeElement); 
     let keyups = Observable.fromEvent(this.foobar.nativeElement, "keyup"); 
     keyups.subscribe(data => console.log(data)); 
    } 
} 

mit anderen Worten I das Eingangselement mit einer auxilary hashtag angereichert (#tralala), die nicht zu ngForm.Even zusammenzuhängt Obwohl diese Lösung funktioniert, fühle ich mich nicht wohl dabei, weil es sich anfühlt s wie ich einen kleinen Hack anwende. Wir sollten irgendwie in der Lage sein, das native Element des Textfelds eleganter/direkter zu finden, entweder durch @ViewChild oder durch this.form.controls (oder etwas in diesem Sinne), OHNE auf Workarounds wie die, die ich benutzt habe, zurückzugreifen. Aber ich kann nicht genau herausfinden, wie.

Quick Addendum: Ich verwende Angular2 2.0-beta7, wenn das von Bedeutung ist.

Antwort

15

Fügen Sie einfach eine andere Vorlage Variable

#foobar="ngForm" #foobarElement 
@ViewChild("foobarElement") foobar: ElementRef; 

Mit ="ngForm" die Template-Variable einen anderen Zweck bekommt und funktioniert nicht mit @ViewChild()

Wenn Sie denken, dies immer noch funktionieren sollte, betrachten Erstellen eines Fehlerberichts

+0

Danke für die Abstimmung. Wie ich bereits erwähnt habe ich diesen Ansatz versucht und es hat tatsächlich funktioniert. Allerdings (wie auch schon erwähnt) finde ich den Ansatz etwas kontraintuitiv. – xDisruptor

+0

Was erwarten Sie in diesem Fall von '@ViewChild()'? Das Element, zu dem die Template-Variable hinzugefügt wird (''), oder die Anweisung 'ngForm', die der Variablen zugewiesen ist? –

+0

Ich habe die Formulierung aktualisiert, um mein Ziel zu unterstreichen: "Wir sollten irgendwie in der Lage sein, das native Element der Textbox eleganter/direkter zu finden, entweder durch @ViewChild oder durch this.form.controls (oder etwas in diesem Sinne) OHNE Workarounds wie die, die ich benutzt habe. " <- Ich beziehe mich auf die Umgehungs-Tag-Problemumgehung, die ich verwendet habe - nur weil es funktioniert, bedeutet es nicht, dass es elegant ist oder die "Kanon" -Methode in Angular2 (yeah Ich weiß, ich bin ein Perfektionist :)) – xDisruptor

Verwandte Themen