Javascript AngularJS 1.x缓存编译的链接函数
关于AngularJS1.x中的指令,我想知道是否有人看到从$compile服务返回的缓存链接函数有任何问题。例如Javascript AngularJS 1.x缓存编译的链接函数,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,关于AngularJS1.x中的指令,我想知道是否有人看到从$compile服务返回的缓存链接函数有任何问题。例如 myDirectiveModule.directive('myDirective',... return { .... compile:function(tElement) { return function($scope, $element, $attr) { var templateUrl='/path/t
myDirectiveModule.directive('myDirective',...
return {
....
compile:function(tElement) {
return function($scope, $element, $attr) {
var templateUrl='/path/to/myDirective.tpl.html';
//link function cache would store link functions keyed on templateUrl
//for example: cache[templateUrl] = $compile(html);
$linkFunctionCache({
templateUrl:templateUrl
}).then(function(linkFunction) {
linkFunction($scope,function(clonedElement) {
$element.append(clonedElement);
})
});
}
}
....
我可以看到在相当精细的指令上的性能改进,这些指令可能需要在一个页面上编译多次
概念证明。。。
考虑到链接函数被分配为
link=$compile(“”)
多次调用它与多次调用$compile
是不同的。指令生命周期就这样中断了
link
链接函数所做的就是将编译后的指令绑定到提供的范围。在参数的帮助下,可以创建DOM树的克隆,但仅此而已
在上面的例子中,controllerA==controllerB
check是错误的<代码>控制器B在此处未定义,因为控制器构造函数只运行一次<代码>元素1.controller()==元素2.controller()
如果单个指令的生命周期适合这种情况,那么可以通过这种方式优化其性能(考虑到性能确实在提高;还应使用基准测试)。但一种更干净的性能方法是只使用jQuery或vanilla JS在post link函数中构造指令模板
由于此方法阻止了正常指令的生命周期,因此它与任意指令不兼容(不包括可能出现的内存泄漏问题)。不清楚您的意思$compile(…)创建DOM树。对于不同的指令实例,它不能相同。(除了Angular已经优化了很长一段时间,而且认为一种足智多谋的技术可能会被忽略这一事实之外,$compile实际上创建了一个链接函数,您可以使用它绑定到您的作用域,最终创建一个要附加的DOM元素(绑定到您的作用域)。我们的想法是重用链接函数,而不是为每个渲染创建一个新的分支链接函数。这是从哪里得到的?如果您已经知道答案,为什么要问这个问题?我不确定您是否正确理解了链接函数的真正含义。但它肯定不会像你期望的那样起作用。在现实世界的应用程序中试用它,您将看到。
var-link=$compile(“”);var el1=链路(范围1);var el2=link(scope2)
应产生同一元素(el1[0]==el2[0]
),该元素曾一度链接到一个作用域,然后重新链接到另一个作用域。这只会把事情搞砸。没有要缓存的内容。很抱歉这个示例太粗糙,但这里有一个概念的快速证明。。。我认为这里的关键是在controllerB未定义时使用link函数Good call提供的克隆元素。我认为指令控制器将被重复使用的事实足以让我断定这是一件危险的事情。不仅控制器构造函数,其他指令函数也将执行一次。对于大多数指令来说,这将是一个阻碍。