Javascript AngularJS:观察注入服务的作用域值在一个指令中从另一个指令中更改
考虑以下场景 有两个相互独立的指令,我想分享这两个指令之间的范围。因为它们不是嵌套的,所以我不能在指令中使用控制器来共享作用域。因此,我创建了一个服务,并将该服务注入到这两个指令中 因此,当服务的值在一个指令中更改时,我需要在另一个指令中更新相同的值。我怎样才能做到这一点?我希望这是正确的,角度的方式,没有反模式 这就是我迄今为止所尝试的Javascript AngularJS:观察注入服务的作用域值在一个指令中从另一个指令中更改,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,考虑以下场景 有两个相互独立的指令,我想分享这两个指令之间的范围。因为它们不是嵌套的,所以我不能在指令中使用控制器来共享作用域。因此,我创建了一个服务,并将该服务注入到这两个指令中 因此,当服务的值在一个指令中更改时,我需要在另一个指令中更新相同的值。我怎样才能做到这一点?我希望这是正确的,角度的方式,没有反模式 这就是我迄今为止所尝试的 .directive('d1', ['cData', function() { return { link: function() {
.directive('d1', ['cData', function() {
return {
link: function() {
// this watch is not working
scope.$watch( function() {
return cData.Value;
}, function(newValue, oldValue) {
alert(newValue);
})
}
}
})
.directive('d2', ['cData', function() {
return {
link: function() {
element.on('click', function() {
cData.Value = false
scope.$digest();
});
// A watch here is working, I have commented it out
/*scope.$watch( function() {
return cd.showStatus;
}, function(newValue, oldValue) {
alert(newValue)
})*/
}
}
}])
.service('cData', function() {
this.Value = false;
})
我正在更新指令d2
的点击事件中的服务值,我需要触发指令d1
中的手表。这可能不起作用,因为两个指令的作用域不同。我如何才能做到这一点,非常感谢任何帮助
更新
指令d1的模板
模板:'
更新{show:cData.Value==true}
我必须在指令d1的事件侦听器中再次调用scope.$apply()
希望这是正确的方法。您走的是正确的道路,但我建议使用$broadcast
而不是添加新的$watch
。添加一个新的观察者更像是一个局部范围的解决方案(至少在我看来)。因此,这一切归结为在两个独立对象之间共享数据。你可以这样做:
.directive('d1', ['cData', function() {
return {
link: function(scope) {
// this watch is not working
scope.$on('data:changed', function(e, data) {
alert(data);
}
/*
scope.$watch( function() {
return cData.Value;
}, function(newValue, oldValue) {
alert(newValue);
}) */
}
}
})
.directive('d2', ['cData', '$rootScope', function() {
return {
link: function() {
element.on('click', function() {
$rootScope.$broadcast('data:changed', { value: false });
// cData.Value = false
// scope.$digest();
});
// A watch here is working, I have commented it out
/*scope.$watch( function() {
return cd.showStatus;
}, function(newValue, oldValue) {
alert(newValue)
})*/
}
}
}])
在我看来,这是实现独立对象/指令之间通信的最干净的方式,而无需太多麻烦。代码是非常干净和解耦的
你觉得怎么样 这些指令的html格式如何?你能添加属性吗?因为你可以观察这些属性
我不喜欢事件传播。而不是data:changed
你可以写任何有建议的东西。非常感谢这种方法,它正在发挥作用。但是,我必须在事件侦听器($on)中调用$scope.apply()来更新模型。是的,这是因为元素是一个jQuery对象,与AngularJS无关。@prbaron-哪个元素是jQuery对象,$on?不,它是“元素”。它在jQuery中代表您的指令,Andrei Cacio的方法运行良好。我是否应该接受这一正确答案,或者是否有更好的方法可供选择@如果是那样的话,你能给我建议另一种解决方案吗@prbaronWell如果我们从性能的角度来看,事件
比$watchers
便宜。监视程序在脏检查过程中被触发,因此无论是否需要,该函数都将在每个摘要周期中执行。事件仅在需要时触发。在这个问题上,这里有一个很好的stackoverflow asnwer: