【发布时间】:2019-02-01 17:17:26
【问题描述】:
似乎子组件仅在 Observable 第一次发射时才被设置。
容器组件(为调试添加了map操作符):
this.form$ = this.createOrderStore.pipe(select(getFormGroup)).pipe(
tap((val) => {
console.log('observable emitted');
console.log(val);
return val;
})
);
子组件:
private _form: FormGroup;
@Input()
set form(val) {
console.log('set form');
if (val) {
this._form = val;
}
}
get form() {
return this._form;
}
容器模板:
<app-order-form [form]="form$ | async"></app-order-form>
observable 第一次发射时,控制台显示“observable emit”,val 未定义,然后是“set form”。但是,由于第一个值是未定义的,我们还没有在模板中设置它。
observable 第二次发出,控制台记录'observable emit',val 是一个完整的表单组(因此它应该触发更改检测),但没有记录'set form'。这第二个值是我实际需要在模板中设置的值。
只有在 observable 第一次发射时才设置子组件属性有什么原因吗?
【问题讨论】:
-
您实际上不会多次设置表单;当 Observable 发出时,它不会设置表单。您应该在子模板中使用异步管道
-
它应该会触发。你确定第二个包含一些东西,因为角度检查是否应该更新和
undefined === undefined,所以它不会进入设置函数?尝试将其记录在 observable 中(顺便说一句,您可以使用tap进行记录,无需从中返回任何内容) -
@PierreDuc 我按照您的建议做了并编辑了问题。肯定第二次才是真正的价值
-
不知道为什么它不起作用。但是如果你只需要第二个,你可以在
form$obs 中添加一个filter:.pipe(filter((form) => !!form))。不过还是没解释 -
@PierreDuc 有趣的是,我按照您的建议添加了过滤器运算符,并且第一次仍然记录了“设置表单”,就像过滤器没有阻止发出值一样,即使表单是绝对未定义。我真的被这里吹走了......
标签: javascript angular typescript rxjs ngrx