html 标记处的表达式与使用控制器的表达式
Expression at html tag vs using controller
如果我有:
$scope.getA= function(){
// do los stuff
return result;
};
$scope.getB= function(){
// do los stuff
return result;
};
$scope.getC= function(){
// do los stuff
return result;
};
//$scope.getD(), $scope.getE()...
我有一些 html 元素,"渲染"取决于复杂的条件,除了"可读性"之外,以下代码是否有任何性能(渲染速度)差异? 我问这个问题,因为第一个显示所有内容的时间比第二个要长......但是我不确定这是否属实...
<div ng-if="getA()&&(getB()=="text"?getC():getD())||getE()">hello</div>
//more div tags like this...
和
$scope.show = function(){
var bar = getB()=="text"?getC():getD();
return getA()&&bar||getE();
}
//more functions like this...
<div ng-if="show()">hello</div>
//more div tags like this...
解释
ngIf 指令使用原型继承创建一个新作用域,这意味着如果在 ngIf 作用域上找不到该属性,它将查找该属性的原型对象链,该属性$scope由您控制。
知道让我们回到你的代码示例:
ng-if="getA() && (getB() == 'text' ? getC() : getD()) || getE()"
和
ng-if="show()"
在执行 ngIf 时的第一个示例中,将访问父范围 4 次(getA, getB, getC or getD, getE
函数),
在第二个样本中只有一次(show
函数),这就是导致性能差异的原因。
结论
对于您的情况,在控制器中定义方法并在 ngIf 指令中使用它,但请考虑完全避免使用 ngIf 的可能性,因为它会增加 $$watcher 计数,只需执行 DOM 操作(有关更多信息,请参阅 angulart.element )而不增加 $$watcher 计数。
是否有任何文档解释了 HTML 标记中函数的计算
ng-if
指令使用 $watch
来计算表达式。1
从文档中:
--* @ngdoc method * @name $rootScope.Scope#$watch * @kind function * * @description
注册要在
watchExpression
更改时执行的listener
回调。
- 每次调用 ng.$rootScope.Scope#$digest 时都会调用该
watchExpression
,并应返回将监视的值。(watchExpression
不应更改 使用同一输入多次执行时的值,因为它可能被多次执行 时间由ng.$rootScope.Scope#$digest。也就是说,watchExpression
应该是幂等的。
AngularJS $rootScope.Scope API 参考 -- $watch
--$digest();
处理当前范围的所有观察程序及其子级。由于观察者的侦听器可以更改模型,因此
$digest()
会不断调用观察者,直到不再触发侦听器。这意味着有可能进入无限循环。如果迭代次数超过 10,此函数将抛出"超出最大迭代限制"。
AngularJS $rootScope.Scope API 参考 -- $digest
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- java.net和javascript之间正则表达式的差异
- 从控制器返回后Ajax启动事件激发
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- ng init中的表达式无法使用ng repeat
- 如何在单击复选框后调用控制器方法
- 为什么表达式不在角度控制器中动态更新
- 计算 ng 控制器中的表达式
- AngularJS 表达式在将控制器添加到主体时停止工作
- html 标记处的表达式与使用控制器的表达式
- 控制器中的设置值有效,但角度表达式中的设置不起作用;t
- 在AngularJS的指令中使用表达式来表示控制器名(ng-controller)
- 将表达式从模板移动到控制器
- 在Javascript控制器中使用AngularJS表达式
- 什么更快?角度表达式或控制器代码
- 使用来自父控制器的表达式禁用 angularjs 指令中的项
- 如何将AngularJS表达式传递给控制器