【问题标题】:Angular: wrap transcluded content if it existsAngular:如果存在,则包装嵌入的内容
【发布时间】:2018-06-04 23:20:50
【问题描述】:

如果嵌入的内容存在,我如何包装它?

例如my-component的模板:

<div>
    ...
    <div *ngIf="isInvalid" class="error">
        <h2>Extra errors:</h2>
        <ng-content select="extra-error-messages"></ng-content>
    </div>
    ...
</div>

组件可以这样使用

<my-component>
    <extra-error-messages>
       Do not ever try this!
    </extra-error-messages>
</my-component>

在这种情况下应该显示div.error,或者可以这样使用

<my-component></my-component>

在这种情况下,即使isInvalidtruediv.error 也不应该出现。

【问题讨论】:

  • [class.error]="isInvalid"
  • 抱歉之前的评论,我误解了。
  • @RachChen div 如果有效或没有&lt;extra-error-messages&gt;,则不应出现
  • 你是指哪个div
  • @RachChen 我的意思是整个&lt;div *ngIf="isInvalid" class="error"&gt; 不会出现,这就是为什么*hgIf 而不仅仅是error-class

标签: angular angular-template transclusion


【解决方案1】:

您可以通过@ContentChild 获取extra-error-messages 组件,并检查它是否在父模板中呈现。

所以这应该适用于你的情况:

@Component({
  selector: 'my-component',
  template: `
    <div>
        <h2>My component</h2>
        <div *ngIf="isInvalid && errorMessage" class="error">
                                 ^^^^^^^^^^^
                         check whether extra-error-messages is presented
            <h2>Extra errors:</h2>
            <ng-content select="extra-error-messages"></ng-content>
        </div>
    </div>

  `,
  styleUrls: ['./app.component.css']
})
export class MyComponent  {
  isInvalid = true;

  @ContentChild(ErrorMessagesComponent) errorMessage; // get transcluded component
}

Stackblitz Example

更复杂的场景见:

【讨论】:

  • @yurzuy 非常感谢!您的示例有一个小错误:extra-error-message 没有出现...
  • 你的意思是Do not ever try this!?更新示例
  • 谢谢,但它似乎不适用于&lt;ng-container ngProjectAs="extra-error-messages"&gt;...
  • 我在您的示例中没有看到任何 ngProjectAs。
  • 当然,抱歉。这个问题是在昨天关于ngProjectAs 的问题之后出现的,但是在您的帮助下,我已经找到了解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2020-01-30
  • 2019-08-20
相关资源
最近更新 更多