Я тестирую идею динамически меняющихся шаблонов. Я закончил с образцом кода, который упрощает весь процесс, чтобы показать проблему:Предварительно скомпилированные шаблоны странный эффект
<div ng-app="app" ng-controller="MyController">
<content-item ng-repeat="item in data"></content-item>
</div>
и JS:
var app = angular.module('app', []);
app.controller('MyController', function ($scope) {
$scope.data = ["heading1", "heading2"];
});
app.directive('contentItem', function ($compile) {
var templates = [
'<h1>{{item}}</h1>',
'<h4>{{item}}</h4>'];
var compiledTemplates = [];
for (var i = 0, ii = templates.length; i < ii; i++) {
compiledTemplates.push($compile(templates[i]));
}
return {
restrict: "E",
replace: true,
link: function (scope, element, attrs) {
var template = templates[0];
var link = $compile(template);
//var link = compiledTemplates[0];
element.append(link(scope));
}
};
});
Запрограммированные является номером шаблона (0) только для упрощения кода и compiledTemplates массив не используется (следующий образец будет использовать его)
эффект весь перечень элементов визуализируется:
Заголовок1
Заголовок 2
OK. Но я хочу предварительно скомпилировать шаблоны, поэтому процесс компиляции не происходит при каждом вызове функции ссылки.
Итак, если я использую compiledTemplates, мне просто нужно сначала прокомментировать строки в функции ссылок и раскомментировать строку fird (комментарий в коде выше). В функции конечного ссылка выглядит на этот раз:
link: function (scope, element, attrs) {
var link = compiledTemplates[0];
element.append(link(scope));
}
Не много разницы (по крайней мере, я не вижу разницы), но эффект:
заголовок 2
(если мы имеют 10 наименований в списке, последний будет отображаться)
Почему? Что мне не хватает?
Вот JSFiddle: http://jsfiddle.net/yoorek/DcaVM/
I _think_ скомпилированный и связанный объект в обоих случаях одинаковый, поэтому сначала вы добавляете его в одно место, а затем добавляете его в следующее место (и поэтому оно больше не находится в первом). – towr
ДА! вот что я сделал не так. Спасибо за это! – Yoorek