2

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

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

这很丑陋。有了承诺解决我就可以做到

$scope.collection = service.collection()

但这只会更新一次服务。那么我怎样才能使用 Promise 或其他技术来实现呢?

4

2 回答 2

0

您可以为此使用 $broadcast。每当您的服务更改您可以使用的集合时

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

在控制器上

$scope.$on('X:changed', _reassign);
function _reassign() {
    $scope.X = Service.X;
}
于 2013-10-21T06:44:49.317 回答
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");
          });
于 2013-10-20T09:20:32.473 回答