Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 如果某些元素已更改,如何刷新整个字典? {{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的绑定

代码:

我已将用户绑定到图像。现在,如果某些图像发生更改(调用“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>