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: