在控制器之间共享一个restangular资源

时间:2013-07-03 23:04:19

标签: angularjs angularjs-scope

基于this thread我实现了以下(使用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;
});

问题在于,因为调用asyc,所有调用都检查_account并发现它为null,因此进行服务器调用,然后我得到a)多个服务器调用同样的事情和b)未链接的模型。 / p>

如果我改变代码立即返回'promise',我发现我无法编辑任何与ng-model绑定的文本字段。

这有什么办法吗?难道我做错了什么?据我所知原来的线程应该遇到同样的问题..?

1 个答案:

答案 0 :(得分:2)

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

Angular和promises似乎有一个错误,详情如下: 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;
              } 
            );
          }
        }
      }
    });