【问题标题】:AngularJS Binding a changing value from a service to scope valueAngularJS将一个变化的值从服务绑定到范围值
【发布时间】:2013-10-28 19:10:59
【问题描述】:

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

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

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

$scope.collection = service.collection()

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

【问题讨论】:

    标签: javascript angularjs socket.io promise q


    【解决方案1】:

    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");
              });
    

    【讨论】:

    • 这就是我不做的。但是如果你调用resolve,我只使用defer.notify not resolve,它不可能再得到进一步的更新。我不确定这是否是一个好习惯,因为承诺永远不会得到解决
    【解决方案2】:

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

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

    在控制器上

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

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2016-09-02
      • 1970-01-01
      • 2021-01-16
      相关资源
      最近更新 更多