【问题标题】:ng-content transclude from parents scope when there are nested components当存在嵌套组件时,ng-content 从父范围中嵌入
【发布时间】:2017-12-29 14:48:57
【问题描述】:

使用 Angular 2/4,我有一个复杂的页面模板。

假设我有 3 个相互嵌套的组件:page.component、header.component 内部和 header.title.component 内部,并适当设置了自定义选择器。

page.componenthtml模板:

<layout-header></layout-header>
...

header.componenthtml模板:

<section class="dynamic-content" *ngIf="!collapsed" #dynamicContent>
  <layout-header-title></layout-header-title>
  ...
</section>

header.title.componenthtml模板:

<ng-content selector="card-layout-title"></ng-content>

然后,在我的实际页面模板上:

<layout-page>
  <card-layout-title>Title goes here</card-layout-title>
</layout-page>

ng-content selector="card-layout-title" 仅在直接父级是包含要选择的标签的组件时才有效,即从 header.title.component 我无法选择 2-levels-up 嵌套组件来查找要嵌入到 @987654333 中的内容@。

我该怎么做(最好不要添加模板引用并将其传递到每个级别,因为每个级别有 5-10 个嵌套组件)?

【问题讨论】:

    标签: javascript angular transclusion


    【解决方案1】:

    我将这些附加信息从@dohpaz42 的答案中分离出来,因为它与一般用例的相关性要低得多。

    如果您的层次结构不完全平坦,即

    <layout-dyn-page>
      <layout-header>
        <layout-title>Title</layout-title>
        <layout-summary>Summary</layout-summary>
      <layout-header>
    </layout-dyn-page>
    

    上述解决方案将不起作用,因为ng-content select= 不会选择不在顶层的元素。当您尝试将它们向下投影时,无论您如何尝试,都将它们与它们的包装标签一起投影,因此目前选择嵌套在标签内的元素似乎是不可能的。您必须将其展平,即

    <layout-dyn-page>
      <layout-title>Title</layout-title>
      <layout-summary>Summary</layout-summary>
    </layout-dyn-page>
    

    这很可能是 Angular 中的一个错误(或缺少的功能),但目前(没有文档)我们不知道。

    【讨论】:

      【解决方案2】:

      首先,它是&lt;ng-content select=".card-layout-title"&gt;&lt;/ng-content&gt; 而不是&lt;ng-content selector=".card-layout-title"&gt;&lt;/ng-content&gt;;由于缺乏文档,很容易犯错误。

      根据我的测试,似乎在 Angular 2/4 中使用 Transclusion 首先替换了顶级内容,因此当它下降到 ng-content 选择器时,.card-layout-title 元素不再存在。因此,我建议解决此问题的方法是使用嵌套的ng-content 元素将顶级内容“遍历”到链中。 Plunker

      【讨论】:

      • 非常感谢您的 plunkr 并意识到我在 selector= 上的错误,我在这里分叉了您的 plunkr 以展示我在使用此解决方案时遇到的问题。 DOM 多次复制“card-layout-title”(即使您使用类而不是标签)。尝试检查标题,您会明白我的意思 plnkr.co/edit/gD1IMFFJAsz61gIRSfsb?p=preview 。 ng-content 没有像我认为的那样脱落标签,所以有 heaps 的 DOM 噪音
      • 我在这里使用ngProjectAs 修复了这个问题。没有这方面的文档,所以我只是猜测并且它似乎有效:plnkr.co/edit/UTSOtkx0IGq6vTsd3v3H?p=preview。我已经编辑了你的答案,希望你不介意
      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      相关资源
      最近更新 更多