javascript - AngularJS 上的函数启动次数过多

标签 javascript angularjs performance

我有严重的性能问题

我想在列表中显示详细信息,但该函数被调用太多次。

您可以try demo here

这是 HTML 代码:

<div ng-controller="MyCtrl as ctrl">
<p>Watch your console, then click on a letter. Why "myterious" function is launched so many time ???</p>
<button ng-click="ctrl.setValue('B')">Display B</button>
<button ng-click="ctrl.setValue('C')">Display C</button>
<button ng-click="ctrl.setValue('D')">Display D</button>
  <div ng-repeat="item in ctrl.vitals track by $index">
    <p ng-click="ctrl.toggleDetail($index)" ng-bind="item.name"></p>
    <div ng-show="ctrl.myterious(item.name, ctrl.value)">This should only be display under {{item.name}}</div>
    <div ng-show="ctrl.display[$index]">...</div>
    <br>
  </div>
</div>

这是我的 JavaScript 代码:

var app = angular.module('myApp',[]);

app.controller('MyCtrl', [function() {
    var self = this;

    self.vitals = [
            {name:'A'},
            {name:'B'},
            {name:'C'},
            {name:'D'},
            {name:'E'},
            {name:'F'},
            {name:'G'},
            {name:'H'},
            {name:'I'},
            {name:'J'},
            {name:'K'}
    ];

    self.display = [];
    self.toggleDetail = function(id) {
            console.log("Toggle launched");
        self.display[id] = !self.display[id];
    };

    self.value = 'B';
    self.setValue = function (val) {
        self.value = val;
    }

    self.myterious = function (a, b) {
        console.log(a + ' ' + new Date().getTime());
        if (a === b) {
            return true;
        } else {
            return false;
        }
    }
}]);

我想知道问题出在哪里以及如何修复它,因为它是我原始代码的简化。

最佳答案

所有函数调用的原因都是 ng-show 绑定(bind)。每次更新 DOM 时,它都会运行神秘的函数来确定是否显示该项目。为了避免所有这些函数调用,您的 ng-show 绑定(bind)应该基于静态的东西。请参阅下面的修改示例:

JSFiddle Example

self.vitals = [
      {name:'A', mysterious: false},
      {name:'B', mysterious: true},
      {name:'C', mysterious: false},
      {name:'D', mysterious: false},
      {name:'E', mysterious: false},
      {name:'F', mysterious: false},
      {name:'G', mysterious: false},
      {name:'H', mysterious: false},
      {name:'I', mysterious: false},
      {name:'J', mysterious: false},
      {name:'K', mysterious: false}
    ];

self.setValue = function (val) {
        self.vitals.forEach(function(obj) {
         obj.mysterious = obj.name == val
         })
        self.value = val;
    }

<div ng-repeat="item in ctrl.vitals track by $index">
    <p ng-click="ctrl.toggleDetail($index)" ng-bind="item.name"></p>
    <div ng-show="item.mysterious">
        This should only be display under {{item.name}}  
   </div> </div>

在不知道目标的具体情况的情况下,频繁执行轻量级函数来确定 dom 可见性通常没有任何问题。我唯一一次看到这成为一个问题是当事情失去控制时。如果您有合法的业务理由动态计算 dom 的可见性,请尽可能谨慎地使用它。否则,请尽力基于静态(非函数)绑定(bind)来设计可见性逻辑。

关于javascript - AngularJS 上的函数启动次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234073/

相关文章:

jquery - 我的状态改变了,但页面没有正确刷新

javascript - 如何在 Angular 中动态替换值?

windows - 性能计数器,更改进程 ID?

java - 避免代码重复 Android 类

c++ - 为什么 AVX 点积比原生 C++ 代码慢

Javascript,如何重新创建选择/范围?

Javascript 执行周期

javascript - Angular 应用程序中的 Bootstrap 5

javascript - 如何用json解决无效值的问题

html - 在 flexbox 中将一个放在另一个之上