ngRepeat 不更新,即使 $resource 有

ngRepeat not updating even though $resource has

我有一个“添加朋友”对话框,当您添加用户时,它会回到状态历史记录中,并且应该更新朋友列表。一切正常,除了列表没有显示新用户 - 尽管 console.log 都显示了正确的数据:

[e, e, e, $promise: Promise, $resolved: true]

(3 es 是正确的,我之前有两个).

$scope.add = function (user, goback) {
  if (goback)
    $ionicHistory.goBack();
  $ionicLoading.show();
  ApiService.friends.request(user._id, function (data, status, headers, cfg) {
    $scope.users = ApiService.users.friends(function (res, headers) {
      $ionicLoading.hide();
      console.log($scope.users);
    }); 
    console.log($scope.users);
  }); 
}

我尝试将 $scope.users = 包装在 $scope.$apply 中或在不同的地方调用它,但这只会(正确地)引发 $digest already in progress 错误(因为 $resource automatically 会这样做)。

这是怎么回事,我该如何解决?


wtf是怎么回事?我只是尝试这样做:

$scope.add = function (user, goback) {
  $scope.users = [];
}

(甚至将 $scope.users = [] 包装在 $apply 中)但什么也没有发生! 但是 $scope.add 是从 ng-click 指令调用的 - 这应该有效!


发现真正的错误!

我的添加好友视图,其中 add 被调用,当然有它自己的 $scope。它很脏,但我最终使用 $scope.$parent.users 而不是 $scope.users 来保存数据。

我 运行 最近遇到了这个完全相同的问题。显然 $resource 使用的 $q 承诺仅在 $digest 循环期间解决 设计 (参见 https://github.com/angular/angular.js/issues/2881),这就是为什么你使用 $scope.$apply.

时出现正在进行的摘要错误

解决方法是将您的作业包装在 $timeout 中以强制执行另一个摘要循环,例如:

$timeout(function() {
  $scope.users = ApiService.users.friends(); // Abbreviated
});

我不是 100% 确定为什么要将 ApiService.users.friends() 的结果分配给 $scope.users,因为我猜该方法 returns 是一个承诺,但我可以缺少更大的上下文。

正如我在 OP 中所说,这是一个非常基本的范围错误,因为我忘记了我实际上是在两个操作之间切换 ui-router 视图,所以我的 $scope.users 实际上是两个不同的东西。

将列表移动到 $scope.$parent.users 暂时修复它,但再次考虑它我可能应该将值移动到控制器中并使用 MyController as ctrl 语法。