Angular在哪里放置$ watch

时间:2014-07-09 17:57:03

标签: javascript angularjs

我有一个promise对象,我的页面可以从中获取类似的数据:

promise.then(function (data) {
    $scope.myData = data;
});

在当时的回调之外,我对页面上的对象进行了监视。如果我要观看我的承诺提供的一些数据,我是否应该将#watches置于承诺的回调中?

3 个答案:

答案 0 :(得分:0)

当你观察一个对象时,它实际上只是注册了对现有对象的更改的订阅。它会在注册变更之前一直运行,因此将其置于承诺的决心之内是不必要的。

答案 1 :(得分:0)

我原本以为你只想在声明接收数据的变量后设置$ watch。如果没有看到代码就很难确定,但如果每次承诺返回时我设置$ watch,我都会遇到问题。

$ watch的回调函数既传递旧值又传递新值,因此您可以检查值以确定要执行的监视操作。

答案 2 :(得分:0)

您应该从服务中检索您的数据:

app.factory('myService', function($http) {
   var someData = [];
   return {
       getData: function() {
           var promise = $http({method:'GET', url:'/api/someurl' });
           promise.success(function(data) { 
               angular.copy(data, someData);
           });

           return promise;
       },
       data: someData
   }

});

然后将数据分配给控制器内的范围

app.controller('ctrl', function($scope, myService) {
    $scope.data = myService.data;
});

在HTML中或在指令

中使用数据
<body ng-app="app">
     <ul>
        <li ng-repeat="item in data">{{ item }}</li>
     </ul>
     <my-directive model="data"></my-directive>
</body>

如果您使用自定义指令,建议您在指令的链接功能中设置$ watch:

app.directive('myDirective', function() { 
     return { 
        restrict: 'E',
        link: function(scope, elem, attr) {
            scope.$watch('data', function(newVal) {
                 ...
            });
        }
     }
});

$ watch处理程序没有理由在promise的回调中。它应保持独立,以便在从服务中检索数据的方式与从视图中消耗数据的方式之间保持清晰的分离。