【发布时间】:2013-10-01 15:36:48
【问题描述】:
在以下情况下如何使用嵌入。目的是在 html(部分)文件中使用标记,而不是在模板中(在指令中)定义它。
我在这里找到了一个很棒的树指令。 (source) 原文:http://jsfiddle.net/n8dPm/
我没有在指令中定义模板,而是尝试使用嵌入的内容。我还将 Angular 更新为 1.2.0.rc2。 更新:http://jsfiddle.net/aZx7B/2/
出现以下错误
TypeError: 对象 [object Object] 的属性“$transclude”不是 功能
代码:
module.directive("tree", function($compile) {
return {
restrict: "E",
transclude: true,
scope: {family: '='},
template:
'<ul>' +
'<li ng-transclude></li>' +
'<li ng-repeat="child in family.children">' +
'<tree family="child"></tree>' +
'</li>' +
'</ul>',
compile: function(tElement, tAttr) {
var contents = tElement.contents().remove();
var compiledContents;
return function(scope, iElement, iAttr) {
if(!compiledContents) {
compiledContents = $compile(contents);
}
compiledContents(scope, function(clone, scope) {
iElement.append(clone);
});
};
}
};
});
<div ng-app="myapp">
<div ng-controller="TreeCtrl">
<tree family="family">
<p>{{ family.name }}</p>
</tree>
</div>
</div>
编辑:
在大卫的建议下,做了一些改动。 http://jsfiddle.net/aZx7B/3/
现在,它打印出来了,家长。改变,family -> treeFamily 没用
【问题讨论】:
-
这有几个问题:您在嵌入中引用了 family.name,但 family 是指令范围的一部分,并且不可用。您必须使用 treeFamily.name。此外,您的嵌套树不会包含嵌入的内容。如果你使用提供给编译函数(第三个参数)的 transclude 函数而不是 ngTransclude,你可能会走得更远。
-
感谢大卫,更新一些变化。
-
我一直在做类似的事情,想将我的 html 保存在模板中。但是除非我在链接函数中手动编译它,否则递归将不起作用(无限摘要 - 我认为)。我真的很想知道为什么会这样,所以我实际上可以根据知识做出编码决策,而不是“因为它就是这样”
-
我编辑的答案是否解释了为什么模板要正确输出?使用我最后一个版本的代码,您应该能够将任何您想要的内容传递到您的自定义指令中,从而使用它们自己的模板来诱导其他自定义指令。
标签: javascript angularjs