Почему onCompleted для Observable не имеет значений формы?

Цель: я хотел бы получить значение ввода в реактивной форме 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>

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

Alexander Staroselsky 06.02.2019 19:36

@AlexanderStaroselsky, если я возьму элемент и попытаюсь вывести его на консоль, внутри if (this.isLoaded) .. ничего не произойдет. Что мне здесь не хватает? Должен ли я просто создать отдельную скрытую форму, которая не делает этого для получения значений?

seesharp 06.02.2019 19:45

Да, это все еще будет проблемой, даже если вы установите его сразу после установки isLoaded, поскольку рендеринг не происходит мгновенно. Вам следует полностью избегать использования document.getElementById(). Вместо этого попробуйте использовать API, предоставляемый Reactive Forms, для получения/установки значения.

Alexander Staroselsky 06.02.2019 19:49

@AlexanderStaroselsky, единственная причина, по которой я использую getElementById, заключается в том, что я перевожу с английского на испанский с помощью i18n, поэтому интерполированные значения неизвестны в машинописном тексте. Я создаю скрытые входные данные и беру их переведенные значения i18n, а затем в машинописном тексте использую это динамически переведенное значение для помещения в реальную форму.

seesharp 06.02.2019 19:50
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
45
0

Другие вопросы по теме