ng重复不更新,即使$ resource有

时间:2015-02-05 00:36:15

标签: angularjs angularjs-scope angularjs-ng-repeat ngresource

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

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

(3 e s是正确的,之前我有两个。)

$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 automaticall会这样做)。

发生了什么,我该如何解决这个问题?


wtf正在进行中?我只是试着这样做:

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

(甚至在$ apply中包裹$scope.users = [])但没有任何反应! 但$ scope.add是从ng-click指令调用的 - 这应该有效!


发现实际错误!

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

2 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题。显然,$q使用的$resource承诺仅在$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,因为我猜这个方法会返回一个承诺,但我可能会错过更大的上下文。

答案 1 :(得分:0)

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

将列表移动到$scope.$parent.users现在修复它,虽然再次考虑它我应该将值移动到控制器并使用MyController as ctrl语法。