【问题标题】:How to ensure load observable data before rendering reactive form in angular如何确保在以角度呈现反应形式之前加载可观察数据
【发布时间】:2018-03-25 20:24:49
【问题描述】:

我正在研究 Angular 5 应用程序中的反应式表单,表单组。我通过订阅 observable 的 API 获取数据。我的问题是我的 formGroup 在不存在时尝试加载数据并引发异常。我需要确保在 formGroup 初始化之前 loadData() 加载数据。

组件

export class QuestionsComponent implements OnInit {

@Input() questions: QuestionBase<any>[] = [];
@Input() questionsList: QuestionBase<any>[] = [];
@Input() questionsMappedList: QuestionBase<any>[] = [];
form: FormGroup;

private view: BehaviorSubject<QuestionsDataModel>;
private consultationQuestions: QuestionsDataModel;

constructor(private dataService: QuestionsDataService, private router: Router, private session: SessionStorageService, private qcs: QuestionControlService, private questionService: QuestionMappingService) {

  }

ngOnInit(): void {
    this.view = new BehaviorSubject<QuestionsDataModel>(null);
    this.loadData();
    this.questions = this.questionService.getQuestions();
    //this.questions = this.questionService.getQuestionList(null);
     this.form = this.qcs.toFormGroup(this.questions); 
}

public loadData():void
{

    //filtersLoaded: Promise<boolean>;

  var consultationId = this.session.getItem('consultationId');

   this.dataService.getQuestions(consultationId)
   .subscribe(data =>{
     debugger;
        this.view.next(data);
        this.questionsList = this.questionService.getQuestionList(data);
        console.log("dynamic questionsList...", this.questionsList);

   });
}

模板

<div>
    <form (ngSubmit)="onSubmit()" [formGroup]="form">

      <div *ngFor="let question of questions" class="form-row">
        <app-question [question]="question" [form]="form"></app-question>
      </div>

      <div class="form-row">
        <button type="submit" [disabled]="!form.valid">Save</button>
      </div>
    </form>

    <div *ngIf="payLoad" class="form-row">
      <strong>Saved the following values</strong><br>{{payLoad}}
    </div>
 </div>

【问题讨论】:

  • 获取数据后为什么不直接调用this.form = this.qcs.toFormGroup(this.questions); ,并在模板中将if与*ngIf="form"结合起来?
  • 我对 Angular 很陌生,如果这样做,我会收到错误 ERROR 错误:formGroup 需要一个 FormGroup 实例。请传入一个。示例:

标签: angular angular-reactive-forms


【解决方案1】:

在 ngOnInit.. 上添加一个布尔条件。

private formData = false;

然后在您的 loadData 函数中执行...

loadData() {

            this.formData = true;

然后在你的模板中做..

<form *nGIf='formData'>

或者干脆做..

<form *nGIf='myFormDataVariables' >

【讨论】:

    【解决方案2】:

    您应该在ngOnInit 中初始化表单,然后在 API 调用后更新其值。

    ngOnInit(): void {
        this.view = new BehaviorSubject<QuestionsDataModel>(null);
        this.loadData();
        this.questions = this.questionService.getQuestions();
        this.form = this.formBuilder.group({
          sampleProperty: '',
          // init form values
        });
    }
    

    public loadData(): void {
      var consultationId = this.session.getItem('consultationId');
    
       this.dataService.getQuestions(consultationId)
       .subscribe(data =>{
         debugger;
            this.view.next(data);
            this.questionsList = this.questionService.getQuestionList(data);
    
            this.form = this.qcs.toFormGroup(this.questions); 
       });
    }
    

    【讨论】:

    • 我没明白,我如何初始化表单值,以及 sampleProperty 中的内容是什么?抱歉问傻我对角度很陌生
    • 您可以忽略 sampleProperty,因为它只是示例。将您的 this.qcs.toFormGroup(this.questions) 函数添加到问题中,然后我可以帮助构建该表单。
    • 我们需要 QuestionControlService 提供帮助。
    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2018-02-16
    • 2017-05-23
    相关资源
    最近更新 更多