从使用它的指令更新服务

时间:2013-09-13 21:56:41

标签: javascript angularjs angularjs-directive

指令可以更新服务然后使用更新版本吗?

在我的服务(cfg)中,我有一个变量和一个更新函数......

  var test = "unfired";

  function updateTest(){
    console.log("LOG:","updateTest is firing");
    test = "fired";
  }

在我的指令的链接功能中我有

  scope.$watch(watcher, function(newVal, oldVal) {

    console.log("Before:",cfg.test);
    cfg.updateTest();
    console.log("After:",cfg.test);

  }); //scope.$watch

即使updateTest函数正在触发,控制台也会在之前和之后记录相同的值。

现在如果cfg是控制器而不是服务,我会做类似

的事情
  function updateTest(){
    console.log("LOG:","updateTest is firing");
    test = "fired";
    cfg.$apply() //or cfg.$digest()
  }

但显然这不起作用。我也试过将cfg注入控制器并将$ apply()注入链接函数...

    console.log("Before:",cfg.test);
    scope.$apply(function(){
      cfg.updateTest()
    });
    console.log("After:",cfg.test);

确实触发了updateTest(),但它没有更新cfg服务,因为指令理解它

也许另一种说法是我想将服务“重新注入”指令。

如果您想知道我为什么要这样做,那是因为我有一堆d3.js动画作为共享相同比例的指令,我希望某些事件触发比例域的变化从一个指令到另一个指令。

1 个答案:

答案 0 :(得分:1)

而不是使用服务来在指令之间进行通信。尝试使用“广播”。你可以将一个事件抛到空中,任何人都可以运行你想要的任何功能。它的工作原理如下。

指令1:

$rootScope.$broadcast('event:updateTest');

指令2:

$rootScope.$on("event:updateTest", function (event, next, current) { ... }

然后,您可以处理“test”变量的本地实例,而不是服务“全局”变量。