2014-07-09 191 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的回調中。它應該保持獨立,以便在從服務中檢索數據的方式與從視圖中消耗數據的方式之間有一個清晰的分隔。