如何重新订阅观察?

时间:2017-05-10 19:02:03

标签: angular

我在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)方法时,订阅无效。为什么呢?

1 个答案:

答案 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)
  }

这似乎违反直觉,但是,我确定根据您对可观察输出的使用情况,您可以采用更好的方式来执行此操作。