【问题标题】:How to use *ngIf on own selector of a component?如何在组件的自己的选择器上使用 *ngIf?
【发布时间】:2020-11-07 18:59:37
【问题描述】:

我有一个组件<my-component>,我只想在设置了它的一个属性时才显示它。所以我想在<my-component>做这样的事情:

<ng-container *ngIf="myProperty">
    <div>...</div>
</ng-container>

组件是在 HTML DOM 中创建的。因此,为了避免它的创建,我的假设是我应该将 *ngIf 放在 &lt;my-component&gt; 的选择器上 &lt;parent-component&gt; 中,这将是这样的:

<parent-component>
    <my-component *ngIf="myProperty"></my-component>
</parent-component>

但在这种情况下,属性 myProperty 将设置在 &lt;my-component&gt; 而不是 &lt;parent-component&gt;

那么,如果我的假设是正确的,那么实现它的方法是什么?

【问题讨论】:

    标签: javascript angular angular-ng-if


    【解决方案1】:

    您的问题已经有了解决方案。你在做什么

    <parent-component>
        <my-component *ngIf="myProperty"></my-component>
    </parent-component>
    

    称为内容投影。当您不允许使用*ngIf 进行渲染时,内容将不会被投影。

    编辑

    由于您忘记了重要一点,我在 StackBlitz 中调整了我的示例。为了做到这一点,您需要通过EventEmitter 将标志从内部组件发送到父组件。父组件对其做出反应,因此可以更改参数以隐藏或显示内部组件。

    StackBlitz example

    【讨论】:

    • 我忘了提到 myProperty 是在&lt;my-component&gt; 中设置的。在这种情况下,&lt;parent-component&gt; 中不会设置 myProperty。我编辑我的问题。
    • 感谢您的编辑。对于这样的事情,这似乎是一种相当“复杂”的方式。所以我想知道将 *ngIf 放在这个地方是否正确,或者它是否应该放在子组件中?
    • 你也可以把它放到子组件中。如果 DOM 显示一个空组件,这并不重要——只要它不包含任何干扰页面的样式
    • 不会有干扰,所以我会在子组件中使用*ngIf。感谢您的帮助!
    【解决方案2】:

    解决方案 1:最简单的解决方案是将 &lt;my-component&gt; 的内容(my-component.component.html 的内容)包装在 &lt;ng-container&gt; 中,并在其中添加 *ngIf

    解决方案 2:创建一个服务并在该服务中创建一个 behaviour subject,在两个组件中注入该服务,现在您可以从 &lt;my-component&gt; 切换该行为主题的值并监听 &lt;parent-component&gt; 以切换&lt;my-component&gt;

    【讨论】:

    • 我也是这么想的。但是该组件仍然存在于 DOM 中。在 DOM 中有一个不显示任何内容的组件是一个好习惯吗?
    • 这取决于是否有可能经常切换组件,那么这是一个好方法,因为所有数据都已经初始化。
    • 这是有道理的。感谢您的评论。
    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多