如何避免多个订阅者的观察?

时间:2017-08-21 16:36:25

标签: angular rxjs

我有一个ModalControllerService,它有一个observable可以从Modal返回一个值。 当我只有一个组件在一个页面中打开一个模态时,这个工作很好,但是当我在同一个页面中有多个组件时,所有订阅者都在同一时间订阅。

我要做些什么来避免这种情况,有一种方法来区分订阅者的每个订阅?

@Injectable()
export class ModalControllerService {
  private modalStack: ModalStackObject[] = [];
  private afterDismissObservable = new Subject<any>();
  onAfterDismiss$ = this.afterDismissObservable.asObservable();

  public get lastModal() {
    return this.modalStack[this.modalStack.length - 1];
  }

  close(model?: any) {
    if (this.modalStack && this.modalStack.length > 0) {
      this.lastModal.component.dismiss()
        .then(() => {
          this.afterDismissObservable.next(model);
          this.modalStack.pop();
        });
    }
  }
}

@Component({
  ...
});
export class SomeComponent {
  private modalSubscription: Subscription;
  value: any;

  constructor(modalCtrl: ModalControllerService){
    this.modalSubscription = this.modalCtrl.onAfterDismiss$.subscribe(result => {
      this.value = result;
    });
  }

  ngOnDestroy(){
    this.modalSubscription.unsubscribe();
  }
}

1 个答案:

答案 0 :(得分:0)

我相信这是因为您的组件正在同时进行初始化。组件初始化时,默认构造函数运行。这对你来说可能是一个问题。我不能说太多,但你可以做的是你可以在任何自定义函数中包装onAfterDismiss $ .subscribe()

例如。点击按钮的功能。

<强>组件-1

constructor(modalCtrl: ModalControllerService){
        this.modalSubscription = this.modalCtrl.onAfterDismiss$.subscribe(result => {
             this.value = result;
        });
}

<强>组件-2

constructor(modalCtrl: ModalControllerService){}

click(){                         // it will subscribe to the observable when button is clicked.
        this.modalSubscription = this.modalCtrl.onAfterDismiss$.subscribe(result => {
             this.value = result;
        });
    }
}