似乎很普遍接受你不应该经常手动编译元素(通过$ compile服务)。由于一些动态驱动的html,我们有一个指令,它在链接函数中进行手动编译。这样的事情(动态html的实际检索更加复杂):
link: function(scope, element, attrs) {
element.append(someService.getDynamicHtml());
$compile(element.contents())(scope);
}
我们已经开始遇到一些性能问题,因为有一个页面多次发出此指令,每个编译大约需要300个ms。
为了更好地理解“幕后”发生了什么,从而做出更好的设计决策,我的问题是在链接功能中间进行这种手动编译之间的区别是什么,相反为指令提供模板并让angular自然地编译它?
这是演示我正在谈论的两个场景的小提琴:http://jsfiddle.net/KNLea/
我认为我们可以重构动态html生成,因此它构造了一个字符串,而不是我们可以将它用作模板。以上内容改为:
template: someService.getDynamicHtml(),
link: function(scope, element, attrs) {
//no need for manual compile anymore
}
我只是想了解两者之间存在哪些根本差异,从而了解我们可以期待的性能增益。它根本没有什么区别吗?当angular编译模板时,它只是做$ compile服务做的事情吗?或者模板的自然编译是否存在潜在的差异会导致性能差异?
答案 0 :(得分:1)
Angular本身使用$compile
来编译指令模板,因此手动编译没有固有的减速。
的重要作用,是编辑的时间和频率。
Angular将为每个指令实例编译一次,然后根据需要链接多次 另一方面,您对每个链接进行额外的编译+链接。这是一个很大的开销。
动态HTML是如何动态还不是很清楚,但如果它在会话的生命周期内保持不变,那么有更有效的编译方法。