如何在角度工作中进行嵌套转换?

时间:2013-10-17 15:17:13

标签: javascript angularjs angularjs-directive transclusion

我无法进行嵌套式转换工作。

有两个指令,这两个指令都声明它们将转换其内容。当我嵌套它们时,内部没有任何内容。

这是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>'
     };
 });

2 个答案:

答案 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)

this JSFiddle

中显示了另一种方法,它可以在自包含的组件中使用
.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指令的子指令,这样它总是会将转换传递给它。

将大型指令分解为较小的指令真的很不错。