AngularJS将服务中的更改值绑定到范围值

时间:2013-10-20 07:53:52

标签: javascript angularjs socket.io promise q

我有一个收藏品的工厂。通过从socket.io推送传入值来不断更新此集合。我想将此集合返回到自动更新的范围变量。我不喜欢在控制器中使用回调。我想和defer.resolve(集合)一样的行为。我知道我可以使用defer.notify(集合)但是我需要像

这样的东西
service.update().then(null, null, function(collection){
    $scope.collection = collection()
}

非常难看。有了承诺,我就可以做到

$scope.collection = service.collection()

但是这只会更新服务一次。那么我如何使用承诺或其他技术实现这一目标呢?

2 个答案:

答案 0 :(得分:0)

Angular承诺不再自动展开(我认为从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");
          });

答案 1 :(得分:0)

您可以使用$ broadcast进行此操作。每当您的服务更改集合时,您都可以使用

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

在控制器上

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