It's pretty straightforward once you understand the sometimes-tricky transclude.
ng-transclude basically just calls "element.append( transclude() )" in it's linking function, which basically just adds the transcluded content to the element that asks for it. The way translcude() works is it looks up its parent chain and finds the first element that defines 'transclude:true'. Transclude() then returns that content. In your first example, ng-transclude is defined on your inner element " <test-transclude-inner ng-transclude>". When angular compiles your outer element it sees this as the following: -> test-transclude( new scope, transclude ) -> ng-transclude And normally thats what you want! But if you look carefully at <test-transclude-inner ng-transclude></test-transclude>, you will see that there is no transcluded content. ( Between the <>, there is no HTML! ). Look now at <div><hr />2: <test-transclude-inner><div ng-transclude></div></test-transclude-inner></hr /></div>. You will see that inside <test-transclude-inner>, you now have the <ng-transclude>. "ng-transclude" is now transcluded content. When your inner directive compiles, your "ng-transclude" in your inner directive will be replaced by "ng-transclude" from your outer directive. The ng-transclude directive will then correctly look up to its parent and transclude your intended content. Hope that helps! (transclude is a thing) On Fri, Aug 7, 2015 at 4:54 AM, Cj de Vos <[email protected]> wrote: > I don't understand why the following scenario does not work. Please can > someone explain the issue to me? > > Scenario: 2 directives, both have transclude: true, 1 has a template with > the other directives and the ng-transclude directive. This situation > doesn't render the expected result. Using ng-transclude on another element > fixes the issue, but doesn't make my DOM look really nice. > > > .directive("testTranscludeInner", function () { > return { > restrict: "E", > transclude: true, > scope: true, > template: "<div><hr />1: <div ng-transclude></div></hr /></div>", > link: function (scope, el, attrs) { > scope.name = "TRANSCLUDE1"; > } > } > }) > .directive("testTranscludeOuter", function () { > return { > restrict: "E", > transclude: true, > scope: true, > template: "<div><hr />2: <test-transclude-inner > ng-transclude></test-transclude-inner></hr /></div>", > link: function(scope, el, attrs) { > scope.name = "TRANSCLUDE2"; > } > } > }) > > and the following HTML > > <test-transclude-outer><p>This data should be visible > </p></test-transclude-outer> > > Result: does not render the expected result. > > If instead the template of testTranscludeOuter is as follows, it does work. > template: "<div><hr />2: <test-transclude-inner><div > ng-transclude></div></test-transclude-inner></hr /></div>", > > Looking forward to the reason why it does not work.... > > > Best regards, > CJ de Vos. > > > -- > You received this message because you are subscribed to the Google Groups > "AngularJS" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/angular. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "AngularJS" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/angular. For more options, visit https://groups.google.com/d/optout.
