我在構建使用其內容作爲模板的指令時遇到了問題。在這種特殊情況下,該指令正在調用一個web服務來獲取一些子元素。內部html可能會或可能不會有ng重複。以下是部分,歸結爲簡化它們:使用其內容作爲模板的指令
<div my-children="1">
{{children.length}}
<ul>
<li ng-repeat="kid in children">
{{kid.name}}
</li>
</ul>
</div>
我的期望是,無論是具有指令屬性會被編譯並使用該模板的元素中。
的指令(簡體)是:
app.directive('myChildren', function($compile, $timeout) {
return {
restrict: 'A',
scope: {
myChildren: '='
},
compile: function(tElement, tAttrs, transclude) {
tElement.append(transclude(tElement));
},
link: function(scope, element, attr) {
scope.children = [];
scope.safeApply = function(fn) {
var phase = this.$root.$$phase;
if (phase == '$apply' || phase == '$digest') {
if (fn && (typeof(fn) === 'function')) {
fn();
}
} else {
this.$apply(fn);
}
};
scope.$watch('myChildren', function(newVal) {
if (!newVal) return;
// mock our service call with timeout
$timeout(function() {
scope.children = [{
id: 1,
name: "one"
}, {
id: 2,
name: "two"
}];
scope.safeApply();
}, 400)
});
}
}
})
這是一個非工作的例子:http://plnkr.co/edit/ZidQ4oBdpYxdg5Fyqe0P?p=preview
雖然它的工作原理,它並沒有回答我關於使用指令元素的內容爲模板的問題。 – lucuma
通過使用transclude,您可以訪問指令範圍的「外部」。 transclude只是用指令模板包裝html。在您的頁面上的HTML範圍可用於您的控制器 - 而不是您的指令 - 這就是爲什麼它不起作用 –
我試過各種不同的情況下,能夠使用指令元素的內容作爲模板。那只是最後一次迭代,只是決定離開它。 – lucuma