3

基于这个线程,我实现了以下(使用 Restangular):

    app.factory('Account', function(Restangular) {
      var _account;

      return {
        get: function(id, success, failure) {
          // If we've already retrieved an account, return that
          if (angular.isDefined(_account)) {
            console.log('local');
            success(_account);

          // Otherwise request the resource and store it for subsequent requests
          } else { 
            console.log('server');
            Restangular.one('accounts', id).get().then(
              // Success
              function(account) {
                _account = account;
                success(_account);
              },
              // Failure
              function(response) {
                if (angular.isDefined(failure)) {
                  failure(response);
                }
              }
            );
          }
        }
      }
    });

我在我的控制器中这样使用它:

Account.get(1, function(account) {
    $scope.account = account;
});

问题是因为调用是异步的,所有调用检查 _account 并发现它为空,因此进行服务器调用,然后我得到 a) 对同一事物的多个服务器调用和 b) 未链接的模型。

如果我更改代码以立即返回“承诺”,我发现我无法编辑与 ng-model 绑定的任何文本字段。

有没有办法解决?难道我做错了什么?据我所知,原始线程应该遇到同样的问题..?

4

1 回答 1

2

这是我的(粗略)解决方案:

Angular 和 Promise 似乎存在一个错误,详细说明如下: https ://github.com/angular/angular.js/issues/1827

该补丁尚未被拉入主分支,因此作为我的问题的解决方法,同时不依赖于向视图发送承诺:

    app.factory('Account', function(Restangular) {
      var _account;
      var _promise;
      var _callbacks = new Array();

      return {
        get: function(id, success, failure) {
          // If we have a local account, immediately call success
          if (angular.isDefined(_account)) {
            success(_account);
          }

          // If we've already obtained a promise, add to callbacks to be notified
          // when the promise resolves
          else if (angular.isDefined(_promise)) {
            _callbacks.push(success);
          }

          // Make a server request
          else { 
            console.log('request from server');
            _callbacks.push(success);
            _promise = Restangular.one('accounts', id).get().then(
              function(account) {
                _account = account;
                // Fulfill promises
                angular.forEach(_callbacks, function(callback) {
                  callback(_account);
                }); 
                _promise = null;
              } 
            );
          }
        }
      }
    });
于 2013-07-04T11:39:42.397 回答