Как передать наблюдаемое значение в @Input() Угловое 4

Я новичок в угловом, и у меня есть следующая ситуация: у меня есть служба getAnswers():Observable<AnswerBase<any>[]> и два компонента, которые связаны друг с другом.

  • онлайн-цитаты
  • динамическая форма

компонент online-quote вызывает службу getAnswers():Observable<AnswerBase<any>[]> в своем ngOnInit() и результат этого передается динамической форме компонента.

Чтобы проиллюстрировать ситуацию, это код моих двух компонентов:

онлайн-quote.component.html:

 <div>
    <app-dynamic-form [answers]="(answers$ | async)"></app-dynamic-form>
</div>

онлайн-quote.component.ts:

@Component({
  selector: 'app-online-quote',
  templateUrl: './online-quote.component.html',
  styleUrls: ['./online-quote.component.css'],
  providers:  [DynamicFormService]
})
export class OnlineQuoteComponent implements OnInit {

  public answers$: Observable<any[]>;

  constructor(private service: DynamicFormService) {

   }

  ngOnInit() {
    this.answers$=this.service.getAnswers("CAR00PR");
  }

}

динамико-form.component.html:

<div *ngFor="let answer of answers">
 <app-question *ngIf="actualPage===1" [answer]="answer"></app-question>
</div>

динамические-form.component.ts:

@Component({
  selector: 'app-dynamic-form',
  templateUrl: './dynamic-form.component.html',
  styleUrls: ['./dynamic-form.component.css'],
  providers: [ AnswerControlService ]
})
export class DynamicFormComponent implements OnInit {
  @Input() answers: AnswerBase<any>[];

  constructor(private qcs: AnswerControlService, private service: DynamicFormService) {  }

  ngOnInit() {

    this.form = this.qcs.toFormGroup(this.answers);

  }

Мой вопрос заключается в том, как правильно передавать информацию из онлайн-цитаты в динамическую форму, если информация о результатах службы getAnswers():Observable<AnswerBase<any>[]> является наблюдаемой.

Я пробовал это разными способами, но это не работает. Я хотел бы, чтобы кто-то помог мне с этим. Большое спасибо!

Ответ 1

Предположим, что DynamicFormService.getAnswers('CAR00PR') является асинхронным (возможно, так и есть), и использование async Pipe для передачи асинхронного результата идет по правильному пути, но вы не можете ожидать получения асинхронного результата прямо сейчас, когда DynamicFormComponent (в ngOnInit), поскольку асинхронный. Результат еще не готов при запуске строки кода ниже.

this.form = this.qcs.toFormGroup(this.answers);

Есть несколько способов, которые могут решить вашу проблему.

1. прослушайте значение valueChange из @Input() answers при помощи ngOnChanges lifehook.

ngOnChanges(changes) {
  if (changes.answers) {
    // deal with asynchronous Observable result
    this.form = this.qcs.toFormGroup(changes.answers.currentValue);
  }
}

2. передать Observable непосредственно в DynamicFormComponent и подписаться на него, чтобы прослушать его результат.

онлайн-quote.component.html:

<app-dynamic-form [answers]="answers$"></app-dynamic-form>

динамические-form.component.ts:

@Component({
  ...
})
export class DynamicFormComponent implements OnInit {
  @Input() answers: Observable<AnswerBase[]>;

  ngOnInit() {
    this.answers.subscribe(val => {
      // deal with asynchronous Observable result
      this.form = this.qcs.toFormGroup(this.answers);
    })
}

Ответ 2

изменить онлайн-quote.component.ts: на следующий

    @Component({
  selector: 'app-online-quote',
   templateUrl: './online-quote.component.html',
  styleUrls: ['./online-quote.component.css'],
  providers:  [DynamicFormService]
})
export class OnlineQuoteComponent implements OnInit {

  public answers$: AnswerBase<any>[];

  constructor(private service: DynamicFormService) {

   }

  ngOnInit() {
    this.service.getAnswers("CAR00PR").subscribe(success=>{this.answers$=success;});
  }

}