我有一个带有许多 ngRepeat 模板的指令,需要一些时间来渲染,我可以接受。但问题是我在同一个视图中不止一次调用这个指令。因此,由于指令的每个实例都会发生 ngRepeat,因此会导致很多冻结和性能问题。
指令的每个实例的模板都是相同的,所以如果我只能在第一次编译它,缓存已编译的 html 并将其用于另一个指令实例,那就太好了。
我有一个带有许多 ngRepeat 模板的指令,需要一些时间来渲染,我可以接受。但问题是我在同一个视图中不止一次调用这个指令。因此,由于指令的每个实例都会发生 ngRepeat,因此会导致很多冻结和性能问题。
指令的每个实例的模板都是相同的,所以如果我只能在第一次编译它,缓存已编译的 html 并将其用于另一个指令实例,那就太好了。
这是我的解决方案,它很脏,但工作正常。
我所做的是在指令函数中与 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....
}
}