angular.js中的静态与动态插值及其性能
static vs dynamic interpolations in angular.js and their performance
简而言之,我想问一下之间的区别
A: {{ variable | filter }}
和
B: {{ 'static string' | filter }}
以下是我的问题:
- 它们都被称为插值还是仅被称为
A
A
使用$interpolate
,而B
使用$parse
——这是真的吗?(基于另一个SO问题)- 性能差异是什么?当我使用
A
时,每次variable
值发生变化时,都会更新模板(侦听变量的变化)。如果有大量的插值(如A
),则可能会由于在模型上进行大量侦听而出现性能问题。B
不同吗?特别是,我正在考虑使用http://angular-translate.github.io/,使用translate
滤波器。某个地方有一个全局变量,包含接口中使用的实际语言,当它发生更改时,所有使用translate
过滤器的B
插值都将更新。但它是如何在下面工作的,什么是在听什么?语言变量值(保存在angular config中)上是否只有一个监听器,可以在语言更改时注册要翻译的多个i18n标签?或者有多个听众?如果我有500个{{ 'static string' | translate }}
插值,它会因为侦听器而减慢我的应用程序吗
如果我哪里错了,请纠正我。
两者都是插值。无论何时涉及{{
和}}
(当然,除非您更改了符号),包装的内容都将通过插值服务。
如上所述,A
和B
都将使用$interpolate
服务。$interpolate
服务使用$parse
服务,因此A
和B
都将"使用"这两种服务。
这些是将从$interpolate
传递到$parse
:的确切字符串
案例A:variable | uppercase
案例B:'static string' | filter
为这两种情况添加的观察者数量没有差异,因为正在观察的是节点的组合nodeValue。
例如,在这两种情况下添加的观察者数量也没有区别:
<div>{{one}}</div>
<div>{{one}} {{two}}</div>
情况A
和B
之间的性能差异归结为用于获取表达式左侧的函数。
在A
的情况下,它基本上将是:
function (locals, scope) {
return ((locals && locals.hasOwnProperty('variable')) ? locals : scope).variable;
}
在B
的情况下(其中string
被保存在clojure中并且具有值static string
:
function() { return string; }
两者在执行时间上的差异应该不明显(除非你有大量的插值)。
一般来说,过滤器应该保持简单,因为它们可以多次执行。
在AngularJS1.3.0-rc.2中,过滤器默认为无状态,这是一个主要的性能改进。
举以下例子:
<div>{{ variable | uppercase }}</div>
当摘要循环运行时,它将检测variable
的值并应用过滤器。下一次运行摘要循环时,variable
的值可能没有更改。由于过滤器是无状态的,这意味着左侧的一个值应该始终从过滤器中生成相同的值,因此它不必再次应用过滤器,而是可以使用上次应用过滤器时的缓存值。
再次有点简化,但你可以在这里阅读更多关于它的信息。
然而,过滤器可以覆盖这一点并成为有状态的,这是Angular Translate中的translate
过滤器所做的。这是必需的,因为您可以在运行时更改语言,而且hello
的值显然不会在每种语言中转换为相同的值。
我对Angular Translate的了解还不足以说明它的性能,但我明天会仔细研究它,并编辑我的答案
- 谷歌地图的插值方法
- SVG实现的单调三次插值没有像d3这样的库
- AngularJS ngTranscluded、angular.noop和插值VS表达式
- AngularJS错误:$interpolate:$routeParams的interr插值错误
- Vue.js-插值错误-如何将样式修改为v-bind:style
- 在已插值的字符串中以角度内插变量
- 在两个值之间插值或“补间”(但不进行动画处理)
- 表达式和插入表达式的插值标记之间的差异
- Highcharts柱状图,从数据表加载时禁用插值
- 如何在d3.js中线性插值transform属性
- 使用Javascript和字符串插值更改html元素的类
- javascript中的Ruby插值在两个实例中的一个实例中不起作用
- 获取字符串中用于插值的字符索引
- unserscore,使用“;{{〃;作为插值符号,我得到了一个例外
- 在d3中,如何从SVG行中获取插值行数据
- angular.js中的静态与动态插值及其性能
- 插值浮动
- 模板文字插值打断空白表
- 使插值双三次函数在ie9中工作
- 在CSS中按半像素移动的图像插值