访问 *ngIf 中的模板变量

Posted

技术标签:

【中文标题】访问 *ngIf 中的模板变量【英文标题】:Access template variable in *ngIf 【发布时间】:2017-12-28 02:01:04 【问题描述】:

我试图在一个元素上定义一个模板变量,并使用它的 hidden 属性来识别该元素是否实际存在于 DOM 中,然后根据它显示另一个元素。但是如果有结构指令,模板变量似乎没有返回值。

<hr class="divider" *ngIf="true" #divi>
<div *ngIf="showResendWelcomeEmailButton">
  <a *wpHasAnyPermission="['something': true]" 
     #resendEmailBtn>
    Resend Welcome Email
  </a>
</div>
<div class="pull-right">
  <a #editAccountBtn>Edit Account Details</a>
</div>

rbtn: resendEmailBtn?.hidden
ebtn: editAccountBtn?.hidden
dline: divi?.hidden

输出是

rbtn:
ebtn: false
dline: 

如您所见,包含属性 ngIfwpHasAnyPermission 的元素上的模板变量都没有返回值。

我最终想要做的是在ngIfhr 中使用resendEmailBtneditAccountBtn 来决定显示分隔线。

解决这个问题的最佳方法是什么?我想避免处理组件代码。尝试用 html 解决这个问题。

【问题讨论】:

【参考方案1】:

该变量在应用*ngIf 的元素之外不可用。

<hr class="divider" *ngIf="false" #divi>

将被替换为

<template let-divi [ngIf]="false">
  <hr class="divider"  >
</template>

divi 只能在&lt;template&gt; 元素中使用。

你可以添加

@ViewChild('editAccountBtn') editAccountBtn:ElementRef;

到您的组件类,使其在整个组件模板中可用。当查询的元素被添加到 DOM 时,它只有一个值。如果它在计算结果为false*ngIf 内,则值将是null

【讨论】:

我很好奇editAccountBtn 是如何在外面访问的。您提到的仅适用于具有结构属性的元素吗?解决我的问题的最佳方法是什么? 我不确定我是否清楚地问了这个问题。我想做的是&lt;hr class="divider" *ngIf="!emailAccountBtn?.hidden"&gt;,这样我只能在按钮存在时显示分隔线。我不关心hr元素的变量。 感谢您花时间回复。为了清楚起见,我访问 editAccountBtn 没有问题,因为它没有任何结构指令。但是,无法访问 resendEmailBtn。我尝试在组件中为此添加 ViewChild,但这没有任何区别.. 对不起,有点晚了。@ViewChild() 也只有在*ngIftrue 时才可用,否则内容不存在且引用为空。你试过true resendEmailBtn 位于一个正确的按钮上,我的意思是我可以看到该元素正在显示。

以上是关于访问 *ngIf 中的模板变量的主要内容,如果未能解决你的问题,请参考以下文章

从Angular中的父组件访问子ngIf

*ngIf 和局部模板变量

如何以角度访问组件模板中的服务变量

Flask - 访问模板中的配置变量

从类型树枝模板中的 FormType 访问变量

Django:访问子模板中的循环变量