我在angular2 appplication中有一个子组件视图:
.ts
ngAfterViewInit() {
this.form1Observable = form1.myForm.valueChanges;
this.form1Observable.subscribe(() => // some code);
}
html的
<select (change)="change($event) #select>
<option value="0">New</option>
<option value="1">Existing</option>
</select>
<div *ngIf="select.value == 0">
<myForm1></myForm1>
</div>
<div *ngIf="select.value == 1">
<myOtherForm></myOtherForm>
</div>
如果我更改了select {i} loose
我在ngAfterViewInit
方法上进行的订阅,那么我将select change
方法再次绑定到订阅:
change($event) {
setTimeout(() => {
if($event.target.value == 0) {
this.form1Observable.subscribe(() => // some code);
}, 500)}
//If not set this time out got an error sayng that form1 is undefined.
问题在于,当我执行此change($event)
方法时,订阅无效。为什么呢?
答案 0 :(得分:0)
我建议您直接在subscribe
上设置myForm.valueChanges
并让它在组件上存储变量。然后,您可以在变量上执行代码而不是重新订阅。将valueChanges
复制到新变量中不会将更新发送到valueChanges
。
如果要从valueChanges
Observable创建一个新的Observable,可以将其输出包装在ReplaySubject或BehaviorSubject方法中:
ngAfterViewInit() {
this.form1Observable = new ReplaySubject<any>();
form1.myForm.valueChanges.subscribe((thing) => this.form1Observable.next(thing));
this.form1Observable.subscribe(() => // some code)
}
这似乎违反直觉,但是,我确定根据您对可观察输出的使用情况,您可以采用更好的方式来执行此操作。