我是angular的新手,我有以下情况,我有一个服务和两个相互关联的组件.

  • online-quote
  • dynamic-form

online-quote组件在其ngOnInit()方法中调用服务getAnswers():Observable<AnswerBase<any>[]>,其结果被传递给组件dynamic-form.

为了说明这种情况,这是我的两个组件的代码:

网上报价.组成部分html:

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

网上报价.组成部分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");
  }

}

动态形式.组成部分html:

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

动态形式.组成部分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>[]>的结果信息是可观察的,那么将信息从online-quote传递到dynamic-form的正确方式是什么.

我试过很多方法,但都不管用.我想找个人帮我.非常感谢你!

推荐答案

假设DynamicFormService.getAnswers('CAR00PR')asynchronous(很可能是这样),使用async Pipe传递异步结果是正确的,但是在创建DynamicFormComponent(at ngOnInit)时,由于Asynchonous,现在不能期望得到异步结果.当运行下面的代码行时,结果还没有准备好.

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

有几种方法可以解决你的问题.

1. listen to valueChange of @Input() answers at ngOnChanges lifehook.

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

2. pass Observable directly into DynamicFormComponent and subscribe to it to listen to it's result.

网上报价.组成部分html:

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

动态形式.组成部分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);
    })
}

Typescript相关问答推荐

如何在同一页面中使用布局和提供程序?

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

如何从具有给定键列表的对象类型的联合中构造类型

Angular 17 -如何在for循环内创建一些加载?

如何访问Content UI的DatePicker/中的sx props of year picker?'<>

为什么tsx不判断名称中有"—"的属性?'

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

如何在TypeScrip中使用嵌套对象中的类型映射?

类型脚本满足将布尔类型转换为文字.这正常吗?

是否可以从函数类型中创建简化的类型,go 掉参数中任何看起来像回调的内容,而保留其余的内容?

是否可以针对联合类型验证类型属性名称?

使用数组作为类型中允许的键的列表

是否可以判断某个类型是否已合并为内部类型?

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

下载量怎么会超过下载量?

抽象类对派生类强制不同的构造函数签名

从以下内容之一提取属性类型

如何在Next.js和Tailwind.css中更改悬停时的字体 colored颜色

如何创建一个将嵌套类属性的点表示法生成为字符串文字的类型?

确保财产存在