更新:
的 我应该将所有函数和变量添加到作用域吗? 强>
不,如果您需要在模板中访问它们,则只应向范围添加函数和变量。仅在控制器功能中访问的变量不应位于范围内,它应该是控制器功能的本地变量。
的 如果我在范围中添加了很多功能,会影响性能吗? 强>
一般来说,没有。您的作用域上的函数执行类似 ng-click="myFunction()" 不应以明显的方式影响绩效。但是如果你的函数执行如下: {{myFunction()}} 它会在每个摘要中执行,因为Angular需要知道它的返回值是否已经改变,以便它可以更新UI。
ng-click="myFunction()"
{{myFunction()}}
的 如果我在范围中添加了很多变量,它会影响性能吗? 强>
如果您在Angular将检查它们的地方使用它们,它可能会影响性能。这些情况是你打印出来的地方 {{myVariable}} ,如果你使用它们 ng-model="myVariable" , ng-show="myVariable" 等指令 ng-click 不会执行脏检查,因此不会减慢速度。 Angular背后的人建议你不要在一个页面上使用超过2000个表达式,这些表达式需要重新绘制/脏检查,因为你的性能将在此之后开始降级。 2000年的极限是他们在研究Angular中的性能时发现的。
{{myVariable}}
ng-model="myVariable"
ng-show="myVariable"
ng-click
请注意,仅仅因为您在作用域上添加了属性,并不意味着Angular将对其执行脏检查。必须在模板中使用它们才能执行脏检查(但不能用于ng-click)。
的 如果我想在我的Angular应用程序中获得最佳性能,我应该注意什么? 强>
就像我上面提到的,尝试将绑定模板表达式的数量保持在2000以下。如果在范围上实现监视,请确保监视的表达式执行得非常快。这是一个如何不应该这样做的例子:
$scope.items = []; for (var i = 0; i < 1000; i++) { $scope.items.push({prop1: 'val1', prop2: 'val2', prop3: 'val3'}); } $scope.$watch('items', function() { }, true);
通过添加 true 作为$ watch的第三个参数,你告诉Angular循环 $scope.items 对于每个摘要周期来检查千件物品的任何属性是否已经改变,这在时间和记忆方面都是昂贵的。
true
$scope.items
你应该做的是:
$scope.items = []; for (var i = 0; i < 1000; i++) { $scope.items.push({prop1: 'val1', prop2: 'val2', prop3: 'val3'}); } $scope.$watch('items.length', function() { });
也就是说,只检查何时 $scope.items.length 已经改变。该表达式将很快执行。
$scope.items.length
的 原帖: 强>
如果你的问题是“将函数暴露给模板比使用对象更好”那么是的,你应该尽可能多地使用函数。这样你就可以将逻辑封装在控制器中,而不是让它流入你的模板。举个例子:
<div ng-show="shouldShow">Toggled div</div> <button ng-click="shouldShow = !shouldShow">Toggle<button>
这里的模板对正在发生的事情有太多的了解。相反,这应该像这样解决:
// controller var shouldShow = false; scope.toggle = function() { shouldShow = !shouldShow; } scope.shouldShow = function() { return shouldShow; } <!-- template --> <div ng-show="shouldShow()">Toggled div</div> <button ng-click="toggle()">Toggle<button>
通过这样做,在不触及模板的情况下扩展控制器中的逻辑是微不足道的。虽然您现在的要求可能只是在按下按钮时切换div,但明天的要求可能是在发生这种情况时更新应用程序的其他部分。如果您使用函数,则很容易在函数内添加该逻辑而无需更改模板。
您的作用域上的函数比使用属性有更多的开销,但是当这一天到来时,这种开销可能不会减慢您的应用程序的速度。所以当它们有意义时使用函数。
但是你仍然应该尽量保持你的控制器尽可能小。如果它们成长为包含大量功能/功能,您应该将控制器拆分为可重复使用的指令。