指令可以更新服务然后使用更新版本吗?
在我的服务(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动画作为共享相同比例的指令,我希望某些事件触发比例域的变化从一个指令到另一个指令。
答案 0 :(得分:1)
而不是使用服务来在指令之间进行通信。尝试使用“广播”。你可以将一个事件抛到空中,任何人都可以运行你想要的任何功能。它的工作原理如下。
指令1:
$rootScope.$broadcast('event:updateTest');
指令2:
$rootScope.$on("event:updateTest", function (event, next, current) { ... }
然后,您可以处理“test”变量的本地实例,而不是服务“全局”变量。