我熟悉以下实现控制器之间通信的方法。
还有其他人吗?有更好的方法/最佳实践吗?
$broadcast
/$emit
.controller("Parent", function($scope){
$scope.$broadcast("SomethingHappened", {..});
$scope.$on("SomethingElseHappened", function(e, d){..});
})
.controller("Child", functions($scope){
$scope.$broadcast("SomethingElseHappened", {..});
$scope.$on("SomethingHappened", function(e, d){..});
})
.controller("AnotherChild", functions($scope){
$scope.$on("SomethingHappened", function(e, d){..});
});
或者,从视图:
<button ng-click="$broadcast('SomethingHappened', data)">Do Something</button>
优点:
缺点:
- 兄弟姐妹之间不起作用,除非有共同的祖先,例如
$rootScope
, 用来
函数的范围继承
<div ng-controller="Parent">
<div ng-controller="Child">
<div ng-controller="ChildOfChild">
<button ng-click="someParentFunctionInScope()">Do</button>
</div>
</div>
</div>
或者,在代码中
.controller("ChildOfChild", function($scope){
$scope.someParentFunctionInScope();
});
优点:
缺点:
- 对于自下而上来说不太好,因为它需要一个对象(而不是基元)
- 调用祖先函数会产生紧密耦合
- 兄弟姐妹之间不起作用,除非有共同的祖先,例如
$rootScope
, 用来
范围继承 +$watch
控制器仅对范围公开的数据的变化做出反应,并且从不调用函数。
.controller("Parent", function($scope){
$scope.VM = {a: "a", b: "b"};
$scope.$watch("VM.a", function(newVal, oldVal){
// react
});
}
优点:
- 适合不是由控制器创建的子作用域,例如就像里面一样
ng-repeat
缺点:
其他值得注意的提及:
- 具有专业功能的共享服务
- 更通用的 Pub/Sub 服务
$rootScope