我认为您的问题对于单个 SO 问题来说太宽泛了。如果您想询问有关动态模板的单独问题,这是替换项目的一种方法... (小提琴)
<script type="text/ng-template" id="test.html">
<h1>Template H1 for {{name}}</h1>
This should replace everything, but the <h1>
element can be overridden
</script>
<div class="boxed">
<parent>
<h1>Hello, {{name}}</h1>
This should say only the person's name
</parent>
</div>
<div class="boxed">
<parent>
This should say whatever the default is
</parent>
</div>
![可模板化的模板](https://i.stack.imgur.com/4V2Lk.png)
使用transclude
andcompile
代替link
我们可以使用模板并且仍然可以访问原始元素。该compile
函数返回一个函数,类似于link
指令返回的普通函数。它linker
作为一个参数,您可以调用该函数并提供另一个可以访问原始元素的函数(clone
此处)。
transclude: true,
templateUrl: 'test.html',
compile: function(element, attrs, linker) {
// need to return linking function
var parent = element.parent();
return function($scope, $element, $attrs) {
linker($scope, function(clone) {
// 'clone' is a copy of the original elements in our 'parent' element
var existing = $element.find('h1'); // in template
if (existing.length == 1) {
// look for replacement h1 element specified in code
for (var i = 0; i < clone.length; i++) {
if (clone[i].tagName == "H1") {
// replace h1 element in template with specified
$element[0].replaceChild(clone[i], existing[0]);
break;
}
}
}
});
}
这使用模板并完全替换标签之间的任何内容,但可以使用参数parent
访问原始内容。clone
在这里,h1
如果原始元素中存在该元素,我将使用它来替换h1
模板中的元素。语法有点滑稽,我希望我可以做一个clone.find('h1')
但克隆似乎是我认为并发现不起作用的 JQLite 对象数组。