在promise.then()中分配时Angular不更新绑定

时间:2013-10-02 16:03:41

标签: javascript angularjs commonjs

在我的角度应用中,我有$scope变量username

如果我将此变量设置为" test"点击:

<a href="#" ng-click="setUser()">Set User</a>

具有功能

$scope.user = {
  name: 'blank'
}

$scope.setUser = function(name) {
  $scope.user.name = name
}

这很好用。但是,如果我在promise.then() *内设置它,它似乎正确设置变量,但在我在$ scope.user上执行了另一个操作之前,Angular不会在视图中更新它。

<a href="#" ng-click="startLogin()">Set User</a>

现在调用一个新函数startLogin()

$scope.user = {
  name: 'blank';
};

$scope.setUser = function(name) {
  $scope.user.name = name;
};

$scope.startLogin = function() {
  var promise = Kinvey.ping();
  promise.then(function(response) {
    console.log('success');
    $scope.setUser('test');
  });
};

这样做之后。视图中的{{user.name}}字段仍然是&#34;空白&#34;。 我还测试了以下内容:

    当我将它记录到控制台时,
  • $scope在该功能中运行良好。
  • 同时正确记录$scope.user,表明变量已更改。
  • 有趣的是,视图最终会在我第二次点击时发生变化。
  • 我也可以通过添加$scope.$apply()解决这个问题,但这似乎是解决此问题的错误方法。

*我使用的Kinvey使用与CommonJS's promise.then()类似或相同的语法

1 个答案:

答案 0 :(得分:5)

双向绑定在角度digest cycle期间更新。这些循环由绑定到指令的DOM事件或参与Angular生态系统的其他实体触发。

因此Angular提供的“魔力”只是自动触发该摘要周期。您可以使用$scope.apply

触发摘要周期
promise.then(function(response) {
  $scope.$apply(function() {
     console.log('success');
     $scope.setUser('test');
  });
});

这是处理第三方库时的推荐方法。