Цель: я хотел бы получить значение ввода в реактивной форме Angular. Я видел, что он был нулевым, если я не сделал тайм-аут, поэтому я попытался использовать onCompleted() наблюдаемого
Согласно RXJS Observable doSomething onComplete и https://angular.io/api/forms/FormGroup#addcontrol
Я решил, что мне нужно будет использовать метод addControl. Однако я не могу получить значение (оно выводится на консоль как ноль)
ngOnInit() {
GetUserProfile();
}
public GetUserProfile()
{
this.aa.GetProfile(id).subscribe(resp => {
this.user = resp;
this.aa.GetPref(id).subscribe(resp =>{
this.email = resp.Email;
// Form Configuration
this.createForm();
this.isLoaded = true;
})
},
err => {
console.info(err);
},
() => {
console.info("On completed?");
this.spanish = (<HTMLInputElement>document.getElementById("spanish2")).value
console.info(this.spanish);
this._profileForm.addControl('spanish3', new FormControl(this.spanish) );
}
);
}
createForm() {
this._pForm = this.fb.group({
'spanish2': new FormControl()
});
}
Фактический результат: он выводит «Завершено?», но также говорит «Невозможно прочитать свойство« значение »нуля» в отношении:
this.spanish = (<HTMLInputElement>document.getElementById("spanish2")).value
Я ожидал, чтобы иметь значение в этот момент. Это работает, только если я использую setTimeout.
HTML:
<mat-card class = "patient-card">
<mat-card-title class = "text-center">
My Profile
</mat-card-title>
<mat-card-content>
<div fxLayoutAlign = "center center" *ngIf = "!isLoaded">
<mat-spinner></mat-spinner>
</div>
<div *ngIf = "isLoaded">
<form [formGroup] = "_pForm" novalidate>
<mat-form-field class = "input-width" [class.hide-element] = "true">
<input matInput placeholder = "Spanish" id = "spanish2" formControlName = "spanish2" i18n-value = "@@AiBrErQv_G2_91" value = "Spanish">
</mat-form-field>
</form>
</div>
</mat-card-content>
</mat-card>
@AlexanderStaroselsky, если я возьму элемент и попытаюсь вывести его на консоль, внутри if (this.isLoaded) .. ничего не произойдет. Что мне здесь не хватает? Должен ли я просто создать отдельную скрытую форму, которая не делает этого для получения значений?
Да, это все еще будет проблемой, даже если вы установите его сразу после установки isLoaded, поскольку рендеринг не происходит мгновенно. Вам следует полностью избегать использования document.getElementById(). Вместо этого попробуйте использовать API, предоставляемый Reactive Forms, для получения/установки значения.
@AlexanderStaroselsky, единственная причина, по которой я использую getElementById, заключается в том, что я перевожу с английского на испанский с помощью i18n, поэтому интерполированные значения неизвестны в машинописном тексте. Я создаю скрытые входные данные и беру их переведенные значения i18n, а затем в машинописном тексте использую это динамически переведенное значение для помещения в реальную форму.





Этот блок окружен
*ngIf, который зависит от асинхронно заданного свойства классаisLoaded. Этот input#spanish2 может просто не существовать в момент выполненияdocument.getElementById('spanish2'). Вы также не должны рассчитывать наsetTimeout(), так как в зависимости от того, сколько времени требуется для разрешения асинхронного вызова, количество времени может варьироваться.