2014-07-09 147 views
0

我有一个承诺对象从我的网页获取的数据是这样的:

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

和外部的回调,然后我对页面上的对象手表。如果我要观看我承诺提供的某些数据,我是否应该始终将我的#watches放在承诺的回调中?

回答

0

当你观察一个对象时,它实际上只是注册一个对现有对象变化的订阅。它不会运行,直到更改被注册为止,因此将它放在承诺的解决方案中是没有必要的。

0

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

$ watch的回调函数传递了旧值和新值,因此您可以检查值以确定要执行的手表操作。

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; 
}); 

消费,或者从你的指令

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

如果你有一个自定义指令里面去你的HTML中的数据,建议您在指令链接功能中设置您的$ watch:

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

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