基于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绑定的文本字段。
这有什么办法吗?难道我做错了什么?据我所知原来的线程应该遇到同样的问题..?
答案 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;
}
);
}
}
}
});