2013-11-14 60 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

相關問題