ngRepeat 不更新,即使 $resource 有
ngRepeat not updating even though $resource has
我有一个“添加朋友”对话框,当您添加用户时,它会回到状态历史记录中,并且应该更新朋友列表。一切正常,除了列表没有显示新用户 - 尽管 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 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
语法。
我有一个“添加朋友”对话框,当您添加用户时,它会回到状态历史记录中,并且应该更新朋友列表。一切正常,除了列表没有显示新用户 - 尽管 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 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
语法。