2013-10-20 36 views
2

我有一個擁有集合的工廠。通過從socket.io推送傳入值,此集合不斷更新。我想將此集合返回到自動更新的範圍變量。我不喜歡在控制器中使用回調。我想就像一個defer.resolve(集合)相同的行爲。我知道我可以使用defer.notify(集),但然後我需要這樣的東西AngularJS將服務中的變化值綁定到範圍值

service.update().then(null, null, function(collection){ 
    $scope.collection = collection() 
} 

這是相當難看。承諾解決我只能做

$scope.collection = service.collection() 

但是,這隻更新該服務一次。那麼我如何使用承諾或其他技術來實現這一點呢?

回答

0

角度承諾不再自動展開(從1.2.0-rc.3我認爲),我沒有看到那裏的醜陋。

如果你的服務是異步和回報的承諾,如:

app.factory('service', function ($http, $q) { 

    return{ 
     update: function() { 

      var deferred = $q.defer(); 

      //.... 
      .success(function (data) { 
         deferred.resolve(data); 
       }).error(function() { 
       deferred.reject("Error ..."); 
      }); 
      //Returning the promise object 
      return deferred.promise; 
     } 
    }; 
}); 

控制器看起來像:

service.update() // returns promise 
     .then(function (result) { 
      //.....       
     }, function (result) { 
      alert("Error: No data returned"); 
      }); 
+0

這是我在做什麼不上。但我只使用defer.notify不解決,如果你打電話解決,它不可能得到進一步的更新了。我不確定這是否是一種好的做法,因爲承諾永遠不會得到解決 – maggocnx

0

您可以使用$廣播這一點。每當你的服務改變了收集,你可以使用

$rootScope.$broadcast('X:changed'); 

而且控制器

$scope.$on('X:changed', _reassign); 
function _reassign() { 
    $scope.X = Service.X; 
}