2013-11-14 27 views

回答

2

你直接分配的承诺,你的模型变量。所以即使在很多方面你的变量的行为就像获得了承诺的结果,但它实际上却包含了对承诺的约束。

因此,您的变量会在$ digest循环期间设置为已解析的承诺值 - 覆盖您的编辑。

所以不是你的变量绑定到这样的承诺:

$scope.myUser = getUser(); 

使用承诺的then方法和分配承诺的结果。这种方式myUser初始化为您的承诺的结果只是一次,而不是永久地约束到承诺本身。

getUser().then(function(result) { 
    $scope.myUser = result; 
}); 
1

在这个例子中,你并不需要明确的promise$http已经返回一个承诺,所以你真的不需要定义一个新的承诺。

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

因为承诺是异步的,所以您必须绑定到successerror回调函数$http内的$scope

它恢复到“旧”值的原因是因为您直接绑定到函数getUser()。这意味着角度设置了一个$watch这个函数的返回值。

这是working fiddle

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; 
      }); 

     }; 
}); 
+0

没准是为'$ http'使用的服务在这种情况下返回一个承诺有一定道理....能只需返回'$ http' – charlietfl

+0

@charlietfl好的,我会更新。顺便说一句,我感到有点惊讶,解决的价值观通过这一观点。角度自动解开承诺吗? –

+1

已经阅读过文档...虽然仍然让我感到困惑。如果它显示在页面中,会假设它已经是可编辑的对象 – charlietfl

相关问题