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.
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
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? –
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