Javascript 如果某些元素已更改,如何刷新整个字典? {{bindUserToImg(user.id)} 更新img 函数SomeListCtrl($scope){ $scope.users=[ {id:1}, {id:2}, {id:3} ]; $scope.images={ 1:{src:'img-1'}, 2:{src:'img-2'}, 3:{src:'img-3'} }; $scope.bindUserToImg=函数(x){ 控制台日志(x); 返回$scope.images[x].src; }; $scope.update=函数(){ $scope.images[2].src='updated img'; }; }
代码: 我已将用户绑定到图像。现在,如果某些图像发生更改(调用“update”方法更改图像#2),angular将刷新所有用户(将为“users”数组中的每个元素调用方法“bindUserToImg”)。是否可以使angular仅更新特定图像并阻止刷新所有字典元素?否,这是不可能的。 简而言之,当您更改范围属性时,angular将触发摘要循环,以查看范围上的任何其他属性是否已更改。目前没有将摘要周期限制在某个范围/组件的机制 在angular的情况下,angular不可能“知道”只有图像2的绑定发生了更改Javascript 如果某些元素已更改,如何刷新整个字典? {{bindUserToImg(user.id)} 更新img 函数SomeListCtrl($scope){ $scope.users=[ {id:1}, {id:2}, {id:3} ]; $scope.images={ 1:{src:'img-1'}, 2:{src:'img-2'}, 3:{src:'img-3'} }; $scope.bindUserToImg=函数(x){ 控制台日志(x); 返回$scope.images[x].src; }; $scope.update=函数(){ $scope.images[2].src='updated img'; }; },javascript,angularjs,performance,Javascript,Angularjs,Performance,代码: 我已将用户绑定到图像。现在,如果某些图像发生更改(调用“update”方法更改图像#2),angular将刷新所有用户(将为“users”数组中的每个元素调用方法“bindUserToImg”)。是否可以使angular仅更新特定图像并阻止刷新所有字典元素?否,这是不可能的。 简而言之,当您更改范围属性时,angular将触发摘要循环,以查看范围上的任何其他属性是否已更改。目前没有将摘要周期限制在某个范围/组件的机制 在angular的情况下,angular不可能“知道”只有图像2的绑定
bindUserToImg
可能会有许多复杂的副作用,这些副作用随输入而变化(并且取决于函数参数以外的变量),因此angular必须对所有绑定执行它
一般的规则是最小化范围绑定的复杂性,因为它们执行得非常频繁。第一步是不要使用函数,因为它们比简单的对象查找成本更高。您的示例可以通过使用
<body ng-controller="SomeListCtrl">
<ul>
<li ng-repeat="user in users">
{{bindUserToImg(user.id)}}
</li>
</ul>
<button ng-click="update()">Update img</button>
</body>
function SomeListCtrl($scope) {
$scope.users = [
{id: 1},
{id: 2},
{id: 3}
];
$scope.images = {
1: {src: 'img-1'},
2: {src: 'img-2'},
3: {src: 'img-3'}
};
$scope.bindUserToImg = function(x) {
console.log(x);
return $scope.images[x].src;
};
$scope.update = function() {
$scope.images[2].src = 'updated-img';
};
}
{{images[user.id].src}
您所说的“将刷新所有用户”是什么意思?在您的示例中,您只在更新时设置图像,不调用其他方法。请尝试按示例()中的“更新”按钮并查看日志。谢谢。看起来有点帮助,但渲染速度仍然很慢。您知道如何进一步提高性能吗?我不知道如何跟踪角度动作,但它似乎并没有只更新字典中的单个元素。它渲染得慢吗?你有一个庞大的列表吗?问题是每个'src'的'images'存储图像的base64字符串。我怀疑图像渲染需要一些时间。因此,当单个图像发生变化时,我需要防止所有集合刷新。如果复制过程简化,我无法确切说明会发生什么。一般来说,angular不会“刷新/重新渲染”任何未更改的内容。
<li ng-repeat="user in users track by $index">
{{images[user.id].src}}
</li>