如何在值更改时执行函数?

时间:2014-04-15 14:00:13

标签: angularjs

我有一个主控制器,还有另外两个控制器:

<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已经改变了?

我可以将函数注册到该值吗?

3 个答案:

答案 0 :(得分:9)

您可以在控制器中执行此操作..

$scope.$watch("value",function(newValue,oldValue){
 // your code goes here...
});

它基本上会监视给定&#34;范围属性&#34;的任何更改。但是,我的建议是使用服务或工厂。

请参阅其他SO讨论:

AngularJS Service Passing Data Between Controllers

答案 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。