gpt4 book ai didi

Angular2 响应式表单和 BehaviorSubject

转载 作者:太空狗 更新时间:2023-10-29 19:32:32 26 4
gpt4 key购买 nike

我是 Angular 的新手,不知道如何使用异步调用来更新响应式表单。

我有一个基于对象模型的 react 形式。表单中的任何更改都会触发 HTTP 请求,该请求可能会发回对象的更新版本作为响应。我需要相应地更新表格。

我用 BehaviorSubject 实现了类似的东西(那些对象的列表),但不确定如何用表单来实现。

编辑:很抱歉没有包含代码。比较乱,这里总结一下。

这是我现在拥有的:

export class EditQuestionnaire implements OnInit {

questionnaireForm: FormGroup;

questionnaire: Observable<Questionnaire>;

// constructor with its dependencies omitted

ngOnInit() {
this.questionnaireForm = this.fb.group({
'id': [''],
'submitted': [false],
'questions': this.fb.array(
[]
),
});
this.questionnaire = this.questionnaireService.getQuestionnaireGeneral(); // This is an observable of a BehaviorSubject that gets updated in a service with every call to getQuestionnaire

this.questionnaireService
.getQuestionnaire(this.questionnaire.id)
.subscribe(questionnaire => {
this.questionnaireForm = this.loadQuestionnaire(questionnaire); // loads the questionnaire into the form
});
}
...
}

我还有一个子组件,表示问卷中的一个问题。在这里我检测到变化:

export class QuestionComponent implements OnInit {

@Input() questionForm: FormGroup;
@Input() questionnaireId: string;

// constructor and dependencies omitted

get text() {
return this.questionForm.get('text') as FormControl;
}
get answers() {
return this.questionForm.get('answers') as FormArray;
}
get id() {
return this.questionForm.get('id') as FormControl;
}
get comment() {
return this.questionForm.get('comment') as FormControl;
}

ngOnInit() {
const questionId = this.id.value;
this.comment.valueChanges
.pipe(
debounce(() => interval(2000))
)
.subscribe(newValue => {
this.saveComment(questionId, newValue);
});

for (const answer of this.answers.controls) {
this.answers.valueChanges.subscribe(val => {
const answerId = answer.get('id').value;
this.saveAnswer(questionId, answer);
});
}

saveComment(questionId: string, comment: string) {
this.questionnaireService.updateComment(questionnaireId, questionId, comment).subscribe(); // no need to rebuild here
}

saveAnswer(questionId: string, answerId: string) {
this.questionnaireService.updateAnswer(questionnaireId, questionId, answerId).subscribe(questionnaire => { /* trigger the form to rebuild */ })
}
}

某些问题的回答可能会触发后续问题,因此从后端发回一个全新的问卷。我在这里遇到的问题是 valueChanges 监听器将新问卷识别为更改,我的应用程序陷入了 HTTP 请求的无限循环。

关于如何解决这个问题有什么想法吗?

更新:

我最终使用 EventEmitter 将收到的问卷对象传递给父组件,我在父组件中重建了表单。

最佳答案

我假设您通过组件触发来自服务的请求。要从您的组件更新响应式(Reactive)表单对象,您可以直接分配它。例如,如果你像这样声明你的 react 形式:

this.form = new FormGroup({
name: new FormControl()
})

您可以像这样简单地更新名称:

let name = "Kyle";
this.form.controls.name.value = name;

在此处的 Angular 文档中找到:

https://angular.io/api/forms/FormControl

关于Angular2 响应式表单和 BehaviorSubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51881982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com