更改后角度可编辑字段恢复为原始名称

时间:2013-11-14 23:28:48

标签: angularjs x-editable

我正在尝试远程获取用户的名称,然后将其编辑为可以再次保存。我正确地得到了这个名字,但是当我尝试更改它时,它又恢复原来的名字。

我是否对延迟和解决做错了什么?

var deferred = $q.defer();
    $http({
            url : '/getuser',
            method : 'GET',
          }).success(function(data) {
             deferred.resolve(data);
          });
         return deferred.promise;

http://jsfiddle.net/NfPcH/181/

2 个答案:

答案 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()

这是working fiddle

<强> 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>