如何从指令中观察服务内的简单变量更改?

Posted

技术标签:

【中文标题】如何从指令中观察服务内的简单变量更改?【英文标题】:How to watch from directive on a simple variable changes inside a service? 【发布时间】:2017-09-22 10:58:27 【问题描述】:

我有一个带有data 变量的简单服务:

import  Injectable  from '@angular/core';

@Injectable()
export class MyService 

  private _data:number;

  get data(): number 
    return this._data;
  
  set data(value: number) 
    this._data = value;
  


现在,每当有人设置我的变量时,我想从一个指令中捕获:

this.myService.data = 12345;

我试图通过订阅来做到这一点,但在语法上遗漏了一些东西:

this.myService.data.subscribe(res => console.log(res));

我错过了什么?我应该声明可观察的吗?为什么和在哪里? 我不确定这个问题是否正确,因为这不是 HTTP 请求,所以更改很简单。

【问题讨论】:

【参考方案1】:

你可以这样实现:

在你的服务中,放置一个 EventEmitter:

dataUpdated : EventEmitter<number> = new EventEmitter();

然后当你设置你的数据时,在setData的末尾添加:

this.dataUpdated.emit(this.data);

它允许通知订阅的组件变量已更改并发送新值(您可以发送任何您想要的值)。

最后在你的组件中,你可以得到这样的通知:

constructor
(
    private service: Service
)

ngOnInit()

    this.service.dataUpdated.subscribe
    (
        (data: number) =>
        
            //setData used, you can use new data if needed
        
    );

【讨论】:

非常感谢。这是一个简单的解决方案!再次感谢 很高兴它对您有所帮助。 :) 顺便说一句-它被更改 3 次是有原因的吗? 你的意思是 setData 被调用了 3 次?你确定你只调用一次 setData 吗? 我有多个指令实例,但每个实例都应该有一个代码吗?

以上是关于如何从指令中观察服务内的简单变量更改?的主要内容,如果未能解决你的问题,请参考以下文章

观察变量并改变它

将范围变量从控制器绑定到指令而不使用$ watch

如何在Angular 2中每次路由更改时观察路由更改和布尔变量的更改值?

$watch'ing Angular 指令中的数据更改

Angular $scope.$watch 用于仅从表单更改的变量(ng-model 指令)

如何从函数内部更改全局变量的值?