1

我正在尝试远程获取用户名,然后使其可编辑,以便可以再次保存。我得到了正确的名称,但是当我尝试更改它时,它会恢复为旧名称。

我在延迟和解决方面做错了吗?

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

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

4

2 回答 2

2

您将承诺直接分配给您的模型变量。因此,即使在许多方面你的变量表现得好像它得到了承诺的结果,但它实际上包含了对承诺的绑定。

因此,您的变量在 $digest 周期中不断设置为 promise 的已解决值 - 覆盖您的编辑。

因此,不要像这样将变量绑定到承诺:

$scope.myUser = getUser();

使用 promise 的then方法并分配 promise 的结果。这种方式myUser只被初始化为你的 Promise 的结果一次,而不是永久地绑定到 Promise 本身。

getUser().then(function(result) {
     $scope.myUser = result;
});
于 2013-11-14T23:55:22.320 回答
1

对于此示例,您实际上并不需要明确的promise. $http已经返回了一个承诺,所以你真的不需要定义一个新的。

我重新安排了代码。为了初始化该值,我使用ng-init来调用该getUser()方法。然后调用$http并绑定到$scope.myUser. 顺便说一句,我注意到只进入error回调。

因为 Promise 是异步的,所以你必须绑定到$scope内部的successorerror回调函数$http

它恢复到“旧”值的原因是因为您直接绑定到 function getUser()。这意味着 angular 正在$watch为此函数的返回值设置 a 。

这是一个工作小提琴

HTML:

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

JS:

app.controller('Ctrl', function($scope, $http, $q) {
    $scope.myUser = null;

    $scope.init = function() {

        getUser();
    };

    function getUser() {

            return $http({
                url : 'http://espn.com/images/test-data/public-profile.json',
                method : 'GET',
            })
            .error(function(data) {
                $scope.myUser = {"name":"bobby","age":"21"};
            })
            .success(function(data) {
                console.log(data);
                $scope.myUser = data;
            });

        };
}); 
于 2013-11-14T23:56:00.560 回答