我有一个主控制器,还有另外两个控制器:
<div ng-controller="mainController" ng-model="value">
<div ng-controller="otherController"></diV>
<div ng-controller="anOtherController"></div>
</div>
由于控制器继承,我的otherController
可以更新value
我与ng-model
直接绑定。
但是为了执行anOtherController拥有的功能,我怎么能注意到anOtherController
value
已经改变了?
我可以将函数注册到该值吗?
答案 0 :(得分:9)
您可以在控制器中执行此操作..
$scope.$watch("value",function(newValue,oldValue){
// your code goes here...
});
它基本上会监视给定&#34;范围属性&#34;的任何更改。但是,我的建议是使用服务或工厂。
请参阅其他SO讨论:
答案 1 :(得分:4)
向其他范围发送消息:
$scope.$broadcast('messagename', params);
抓住它:
$scope.$on('messagename', function(params){
alert('something happend');
});
范围向下继承;如果您希望将消息发送到所有范围,请使用$rootScope.$broadcast
。
或者你可以简单地添加观察者。
答案 2 :(得分:1)
你需要小心:
mainController将有一个scope.value
otherController和anOtherController没有定义scope.value,但是如果你尝试访问scope.value它会工作,因为它们是mainController的子代,所以它将横向原型链找到该属性。但是,当您在otherController / anOtherController中为scope.value分配值时,您将在范围中定义该变量的本地版本,它将与其他控制器不同。
如果您真的想要修改三个元素的相同元素,则需要将新值分配给子控制器中的父作用域属性。
例如:
如果scope.value等于&#34; old&#34;在主控制器中:
in otherController:
$scope.$parent.value = "new"
在console.log($scope.value) // "new"
但如果你这样做:
in otherController:
$scope.value = "new"
在console.log($scope.value) // "old"
现在,知道所有这些并回答你的问题,如果你想在anOtherController中每次执行scope.value更改时执行一个函数,你就不会在那个范围内修改那个属性,你可以逃脱:
在anOtherController中:
$scope.watch('value', function(newVal, oldVal) {
myfunc();
}
但是你需要确保你没有为$ scope.value赋值,而是将它们分配给$ scope。$ parent.value。