【问题标题】:Angular Editable Field Reverting to Original Name After Change角度可编辑字段在更改后恢复为原始名称
【发布时间】:2013-11-14 23:28:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: angularjs x-editable


    【解决方案1】:

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

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

    所以不要像这样将你的变量绑定到承诺:

    $scope.myUser = getUser();
    

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      它恢复到“旧”值的原因是因为您直接绑定到函数getUser()。这意味着 Angular 在此函数的返回值上设置了 $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;
                  });
      
              };
      }); 
      

      【讨论】:

      • 有可能正在为$http 使用服务,在这种情况下,返回一个承诺确实有意义....可以只返回$http
      • @charlietfl 好的,我会更新的。顺便说一句,我有点惊讶于解析值绑定到视图。角度会自动解开承诺吗?
      • 已经在文档中阅读过它确实......虽然仍然让我有点困惑。如果它显示在页面中,会假设它已经是可编辑的对象
      • 当一个承诺被分配给一个变量时,承诺保持绑定 - 因此你的问题。因此我建议解除绑定。
      • @KayakDave 我不关注,在 OP 小提琴中 bobby 绑定通过。即使getUser() 正在返回一个承诺。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多