Javascript AngularJS将不断变化的值从服务绑定到范围值

Javascript AngularJS将不断变化的值从服务绑定到范围值,javascript,angularjs,socket.io,promise,q,Javascript,Angularjs,Socket.io,Promise,Q,我有一家工厂,里面有一批藏品。此集合通过从socket.io推送传入值来不断更新。我想将此集合返回给一个范围变量,该变量将自动更新。我不喜欢在控制器中使用回调。我希望类似于defer.resolve(collection)的行为。我知道我可以使用defer.notify(collection),但是我需要 service.update().then(null, null, function(collection){ $scope.collection = collection() }

我有一家工厂,里面有一批藏品。此集合通过从socket.io推送传入值来不断更新。我想将此集合返回给一个范围变量,该变量将自动更新。我不喜欢在控制器中使用回调。我希望类似于defer.resolve(collection)的行为。我知道我可以使用defer.notify(collection),但是我需要

service.update().then(null, null, function(collection){
    $scope.collection = collection()
}
这很难看。有了承诺和决心,我就能做到

$scope.collection = service.collection()

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

角度承诺不再自动展开(我想是从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");
          });

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

$rootScope.$broadcast('X:changed');
在控制器上

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

这就是我正在做的。不。但我只使用defer.notify not resolve。如果您调用resolve,则无法再获得进一步的更新。我不确定这是否是一个好的做法,因为承诺永远不会得到解决