Angular 角度2-模型更改侦听器/可观察(最佳实践)

Angular 角度2-模型更改侦听器/可观察(最佳实践),angular,service,model,observable,Angular,Service,Model,Observable,我有一个组件需要侦听模型中可用的属性更改(剩余时间)。当此变量达到0时,组件将触发一个操作(例如,router.navigate(['/my/path'])) 为此,我的组件订阅了一个主题,每当属性的值发生变化时,就会通知该主题。这是完美的工作 我的问题很简单:这个主题应该在哪里声明?在我的模型中还是在处理我的模型的服务中 例如: 为我服务: onTimeExpired(model, callback){ model.getTimeExpiredSubject().subscribe

我有一个组件需要侦听模型中可用的属性更改(剩余时间)。当此变量达到0时,组件将触发一个操作(例如,router.navigate(['/my/path']))

为此,我的组件订阅了一个主题,每当属性的值发生变化时,就会通知该主题。这是完美的工作

我的问题很简单:这个主题应该在哪里声明?在我的模型中还是在处理我的模型的服务中

例如:

为我服务:

 onTimeExpired(model, callback){
     model.getTimeExpiredSubject().subscribe(
     () => { 
         // some logic here 
         callback();
     }
 }

在我的模型中

 onTimeExpired(callback){
     this.getTimeExpiredSubject().subscribe(
     () => { 
         // some logic here 
         callback();
     }
 }

哪一个更好,为什么?谢谢。

您传递回拨的原因:

 //service
 onTimeExpired(){
     return model.getTimeExpiredSubject();
 }
订阅不能在服务中,因为服务可能在许多组件中使用,所以您必须返回一个可观察的

您必须像组件一样在消费者中订阅

// in the component
this.service.subsucribe(data =>{
 // do something
})

好啊但在我的例子中,我需要对每个消费者应用特定的逻辑。这就是为什么我决定传递回调并返回订阅,而不是返回主题本身(请参见//我的示例中的一些逻辑)。但是您可以在
subscribe
回调中复制回调代码。