2

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

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

4

1 回答 1

0

这是我的解决方案,它很脏,但工作正常。

我所做的是在指令函数中与 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....
    }
}
于 2014-12-17T09:29:28.450 回答