AngularJS - 手动编译vs自然编译

时间:2013-12-11 18:13:52

标签: angularjs angularjs-directive angularjs-compile

似乎很普遍接受你不应该经常手动编译元素(通过$ 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服务做的事情吗?或者模板的自然编译是否存在潜在的差异会导致性能差异?

1 个答案:

答案 0 :(得分:1)

Angular本身使用$compile来编译指令模板,因此手动编译没有固有的减速。

的重要作用,是编辑的时间和频率。

Angular将为每个指令实例编译一次,然后根据需要链接多次 另一方面,您对每个链接进行额外的编译+链接。这是一个很大的开销。

动态HTML是如何动态还不是很清楚,但如果它在会话的生命周期内保持不变,那么有更有效的编译方法。