javascript - AngularJS 1.x 缓存编译链接函数

标签 javascript angularjs angularjs-directive

关于 AngularJS 1.x 中的指令,我想知道是否有人看到从 $compile 服务返回的缓存链接函数有任何问题。例如...

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);
                })
            });
        }

    }
....

我可以看到可能需要在页面上多次编译的非常精细的指令的性能改进

概念证明... https://codepen.io/anon/pen/ZLENVV

最佳答案

考虑到链接函数被分配为 link = $compile('<directive>')多次调用它与调用 $compile 不同。多次。指令生命周期就会以这种方式被破坏。

所有这些link链接函数的作用是将编译的指令绑定(bind)到提供的范围。在 cloneAttachFn 的帮助下参数可以创建 DOM 树的克隆,但仅此而已。

在上面的例子中controllerA == controllerB检查是错误的。 controllerB那里未定义,因为 Controller 构造函数只运行一次。 element1.controller() === element2.controller() .

如果单个指令的生命周期适合这种情况,则可以通过这种方式优化单个指令的性能(考虑到性能确实得到了改善;这还应该通过基准测试进行测试)。但更干净的高性能方法是使用 jQuery 或 vanilla JS 在链接后函数中构造指令模板。

由于此方法会阻止正常的指令生命周期,因此它与任意指令不兼容(不包括可能出现的内存泄漏问题)。

关于javascript - AngularJS 1.x 缓存编译链接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41450067/

相关文章:

javascript - 使用 jquery 使用变量更改点击状态

javascript - 将 DynamoDb 字符串集转换为 JSON

javascript - Angularjs 和 yeoman 的当前位置

css - 在不破坏 CSS 的情况下使用基于 Bootstrap 的 AngularJS 库

javascript - angularjs指令 Controller $element

javascript - 未捕获的类型错误 : Cannot set property 'currentDay' of undefined

javascript - $.ajax 不工作,但 $.getJSON 工作

angularjs - 无法使用 Jenkins 构建 Angular 项目

javascript - 使用 Angular 的 orderBy 指令进行自定义排序

javascript - 如何从 Controller 观察服务中的变量以打开模式?