缓存 AngularJS 指令的编译模板

Posted

技术标签:

【中文标题】缓存 AngularJS 指令的编译模板【英文标题】:Cache compiled template of an AngularJS directive 【发布时间】:2015-02-15 18:28:09 【问题描述】:

我有一个带有许多 ngRepeat 模板的指令,需要一些时间来渲染,我可以接受。但问题是我在同一个视图中多次调用此指令。因此,由于指令的每个实例都会发生 ngRepeat,因此会导致很多冻结和性能问题。

指令的每个实例的模板都是相同的,所以如果我只能在第一次编译它,缓存已编译的 html 并将其用于另一个指令实例,那就太好了。

【问题讨论】:

【参考方案1】:

这是我的解决方案,它很脏,但运行良好。

我所做的是在指令函数中与 XMLHttpRequest 同步加载模板,然后在指令的控制器中只编译一次。

.directive('myDirective', function($compile) 
     var cachedTemplate = null,
         templateCompiled = false;

    var xhr = new XMLHttpRequest();

    // do an asynchronous request to wait until we load the template
    xhr.open('GET', 'directives/template.html', false);
    xhr.send(null);

    if (xhr.status == 200) 
        cachedTemplate = xhr.responseText;
    

    return 
        restrict: 'E'
        scope: 
        date: 'someData'
    

    controller: function($scope, $element, $attrs) 
        if (!templateCompiled) 
          // compile the template only one time.
            cachedTemplate = $compile(cachedTemplate)($scope);
            templateCompiled = true
        

        // replace/include the compiled template in our $element
        $element.replaceWith(cachedTemplate);
        // ... do the job....
    

【讨论】:

这里有一个竞争条件,Ajax 调用可能不会在控制器函数被调用之前及时返回。编辑:没关系,我注意到您进行了同步调用 - 它解决了竞争条件但会导致您的浏览器冻结。

以上是关于缓存 AngularJS 指令的编译模板的主要内容,如果未能解决你的问题,请参考以下文章

在模板中使用原始元素类型的 AngularJS 指令

AngularJS 指令在使用 $.get 加载动态内容后编译

AngularJS-指令command

AngularJs记录

Kendo UI和AngularJS常见问题解析

AngularJS - 无法在链接函数中动态更改指令模板