我有严重的性能问题。
我想在列表中显示详细信息,但该函数被调用太多次。
这是 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)应该基于静态的东西。请参阅下面的修改示例:
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/