我无法进行嵌套式转换工作。
有两个指令,这两个指令都声明它们将转换其内容。当我嵌套它们时,内部没有任何内容。
这是this小提琴,它证明了我的问题。
以下是代码:
function Ctrl($scope) {
$scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
}
angular.module('transclude', [])
.directive('outer', function(){
return {
restrict: 'E',
replace: true,
transclude: true,
scope: {},
template: '<div style="border: 1px solid black;">' +
'<div>Outer</div>' +
'<inner ng-transclude></inner>' +
'</div>'
};
}).directive('inner', function(){
return {
restrict: 'E',
transclude: true,
replace: true,
template :'<div style="border: 1px solid red;">' +
'<div>Inner</div>' +
'<div ng-transclude></div>' +
'</div>'
};
});
答案 0 :(得分:8)
你应该在内部指令中转换,因为transclude会替换内部的html
angular.module('transclude', []).directive('outer', function(){
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<div style="border: 1px solid black;">' +
'<div>Outer</div>' +
'<inner><div ng-transclude></div></inner>' +
'</div>'
};
});
不需要更改内部指令。
我更新了小提琴here
答案 1 :(得分:0)
.directive('outer', function(){
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<div style="border: 1px solid black;">' +
'<div>Outer</div>' +
'<inner></inner>' +
'</div>'
};
})
.directive('inner', function(){
return {
restrict: 'E',
replace: true,
require: '^outer',
template :'<div style="border: 1px solid red;">' +
'<div>Inner</div>' +
'<div ng-transclude></div>' +
'</div>'
};
});
这会将dom树中的transclude: true
传递给内部指令。
这样做的缺点是不能单独使用它并且在jsfiddle中它会抛出ngTransclude: Orphan Directive Error
因此我要求inner
指令是outer
指令的子指令,这样它总是会将转换传递给它。
将大型指令分解为较小的指令真的很不错。