2016-10-29 6 views
7

stworzyłem poniższy formularz w angular2:Korzystanie @ViewChild zdobyć na .nativeElement wejścia an powraca „niezdefiniowane”

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)); 
    } 
} 

Wewnątrz ngAfterViewInit bit nativeElement jest nieokreślony, chyba że usunięcie = „ngForm” część z #foobar = „ngForm” .I przezwycięża ten problem poprzez dokonanie poprawek:

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)); 
    } 
} 

innymi słowy, że wzbogacony element wejściowy z auxilary hashtag (#tralala), które nie są związane z ngForm.Even chociaż to rozwiązanie działa, nie czuję się z tym dobrze, ponieważ to czuję tak jakbym stosował mały hack. Powinniśmy być w stanie odzyskać natywny element pola tekstowego w bardziej elegancki/prosty sposób poprzez @ViewChild lub poprzez this.form.controls (lub coś podobnego) bez stosowania obejść takich jak ten, którego używałem. Ale nie mogę dokładnie określić, w jaki sposób.

Szybki addendum: Używam Angular2 2.0-beta7, jeśli to ma jakiekolwiek znaczenie.

Odpowiedz

15

Wystarczy dodać kolejny szablon zmienną

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

Z ="ngForm" zmienna szablon dostaje inny cel i nie działa z @ViewChild()

Jeśli uważasz, że ten powinien nadal działać, należy rozważyć tworzenie raportu o błędzie.

+0

Dzięki za strojenie. Jak już wspomniałem, próbowałem tego podejścia i to zadziałało. Jednak (jak już wspomniałem), podejście jest trochę ... sprzeczne z intuicją. – xDisruptor

+0

Czego można się spodziewać po '@ViewChild()' w tym przypadku? Element, do którego dodawana jest zmienna szablonu (''), lub do dyrektywy 'ngForm', która jest przypisana do zmiennej? –

+0

Mam aktualizację brzmienia, aby podkreślić mój cel: "Powinniśmy w jakiś sposób odzyskać natywny element pola tekstowego w bardziej elegancki/prosty sposób poprzez @ViewChild lub poprzez this.form.controls (lub coś podobnego) BEZ uciekania się do obejść podobnych do tych, z których korzystałem. " <- Odnoszę się do obejścia pomocniczego tagu, którego używałem - tylko dlatego, że działa to nie znaczy, że jest elegancki lub "kanoniczny" sposób robienia rzeczy w Angular2 (tak, wiem, że jestem perfekcjonistą :)) – xDisruptor

Powiązane problemy