我正在尝试远程获取用户的名称,然后将其编辑为可以再次保存。我正确地得到了这个名字,但是当我尝试更改它时,它又恢复原来的名字。
我是否对延迟和解决做错了什么?
var deferred = $q.defer();
$http({
url : '/getuser',
method : 'GET',
}).success(function(data) {
deferred.resolve(data);
});
return deferred.promise;
答案 0 :(得分:2)
您将承诺直接分配给模型变量。因此,即使在很多方面,你的变量就像它得到了承诺的结果,它实际上包含了对promise的绑定。
因此,您的变量会在$摘要周期内设置为承诺的已解决值 - 覆盖您的修改。
所以不要将你的变量绑定到这样的promise:
$scope.myUser = getUser();
使用promise的then
方法并分配承诺的结果。这种方式myUser
只会被初始化为您的承诺的结果,而不是永久地与承诺本身绑定。
getUser().then(function(result) {
$scope.myUser = result;
});
答案 1 :(得分:1)
对于此示例,您实际上不需要显式promise
。 $http
已经返回一个承诺,所以你真的不需要定义一个新承诺。
我已经重新安排了一些代码。为了初始化值,我使用ng-init
来调用getUser()
方法。然后调用$http
并绑定到$scope.myUser
。顺便说一句,我注意到只进入error
回调。
由于promises是异步的,因此您必须绑定到$scope
的{{1}}或success
回调函数中的error
。
它恢复到'旧'值的原因是因为你直接绑定到函数$http
。这意味着angular正在为此函数的返回值设置getUser()
。
<强> HTML:强>
$watch
<强> JS:强>
<h4>remote</h4>
<div ng-app="app" ng-controller="Ctrl" ng-init="init()">
<a href="#" editable-text="myUser.name" >
{{ myUser.name || 'not set!' }}
</a>
</div>