【发布时间】:2014-07-03 12:18:23
【问题描述】:
我有这样的结构(非常简化):
<div ng-controller="MainCtrl">
<div>Views and other stuff</div>
<div ng-controller="MyCtrl">
<div ng-repeat="item in $root.items track by $index">
{{item.id}}
</div>
<div>
Total value: {{totVal}}
</div>
</div>
</div>
在我的主控制器中,我定义了 $rootScope.items = [{id: 1,..},{id: 2,..},{id: 3,..},..] 并在我的其他控制器我已经定义了 $scope.totVal = 0 和一个用于在 items 数组更改时更新 totVal 的 items 数组的观察者;
.controller('MainCtrl', ['$rootScope', '$scope', function($rootScope, $scope) {
// Are actually fetched from a service
$rootScope.items = [
{id: 1,..},
{id: 2,..},
..
];
}])
.controller('MyCtrl', ['$rootScope', '$scope', function($rootScope, $scope) {
$rootScope.updateTotVal = function() {
var totVal = 0;
// calculations are done here
// Is correct here when I console log after all calculations are complete
console.log(totVal);
$scope.totVal = totVal;
}
$scope.totVal = 0;
$rootScope.$watch('items', function() {
$rootScope.updateTotVal();
}, true);
}]);
我遇到的问题是视图中的 totVal 没有更新。当我控制台记录它在控制台中正确显示的值时,但如果我将 totVal div 滚动出视图并再次返回,它只会在视图中更新。似乎是 Chrome 中的一个 AngularJS 错误,但是当我谷歌时找不到任何类似的情况。它在 FireFox 中运行良好。
如果我在 ng-repeat 之前移动 totVal,它会起作用,如果我删除 ng-repeat,它会起作用(我宁愿不改变 html 的结构,因为它会做很多工作并使设计变得更糟)。我也尝试将 totVal 移动到根范围,但没有成功。
只有绘画/渲染失败,Batarang 和 console.log 总是给我更新的值。
以前有人遇到过这个问题吗?
【问题讨论】:
-
totVal在每次调用updateTotVal时设置为 0。我想这就是为什么你总是看到 0。除非在变量的声明和console.log之间缺少一些代码。 -
"// 计算" 是缺少的代码...
-
link 给出了一些很好的答案,这使我的应用程序的结构更好。但是渲染的问题依然存在。我发现,如果我将要呈现的值放入块元素中,它不会更新,直到它被滚动出视图并再次返回(仅适用于 Chrome)。但是,如果我将值放在跨度或浮动元素中,它就可以工作。必须是 Chrome 和 Angular 的范围/渲染问题...
-
请花点时间查看答案并选择正确的答案(或添加您的解决方案,如果不同)。
标签: javascript angularjs angularjs-ng-repeat angular-ngmodel