0

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

在我的服务(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 动画作为共享相同比例的指令,并且我希望某些事件从一个指令触发比例域的变化给其他人。

4

1 回答 1

1

而不是使用服务在指令之间进行通信。尝试使用“广播”。您可以将事件抛向空中,任何收听的人都会运行您想要的任何功能。它是这样工作的。

指令 1:

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

指令 2:

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

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

于 2013-09-13T22:12:50.350 回答