32

在 knockoutJS 中,可以订阅可观察视图模型属性的更改,例如:

myViewModel.personName.subscribe(function(newValue) {
    alert("The person's new name is " + newValue);
});

我目前正在学习 AngularJS,我想知道 AngularJS 中是否有与此等价的东西?我试过搜索这个,但没有任何运气。

4

3 回答 3

49

AngularJS 中的作用域对象有一个特殊的方法叫做$watch“观察”作用域属性。

它接受一个接收模型新旧值的回调:

$scope.$watch('modelName', function(newValue, oldValue){
    // Do anything you like here
});

回调在初始化和每次模型更改时进行。因此,最好添加一个额外的相等性检查,如下所示:

$scope.$watch('modelName', function(newValue, oldValue){

    // Check if value has changes
    if(newValue === oldValue){
        return;
    }

    // Do anything you like here
});

这使您可以“观察”您的模型并在需要时执行一些操作。

一个额外的说明:如果你正在观察一个包含对象的模型,你应该使用额外的第三个参数,告诉 AngularJS 通过对象相等而不是通过引用来比较两个值(因为引用不会改变,因此不会触发观察者) 像这样:

$scope.$watch('modelName', function(newValue, oldValue){
    // Do anything you like here
}, true); // Add extra 'true' parameter to check for object equality

您可以在AngularJS 范围页面上阅读更多文档。

希望有帮助!

于 2013-06-19T19:59:48.153 回答
7

对于由用户操作或应用程序事件触发的 API 调用和异步数据,您最好使用

$rootScope.$broadcast('updateSearch', value);

直接在服务函数的回调中并在您的控制器中利用它,例如:

$scope.$on('updateSearch', function(event,value) {
  $scope.search = value;
});
于 2013-06-19T20:43:50.867 回答
2

您可以使用 $watch 检查范围对象的属性何时更改。

http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$watch

于 2013-06-19T19:47:46.367 回答