【问题标题】:*ngIf value exists in array*ngIf 值存在于数组中
【发布时间】:2018-07-02 16:22:25
【问题描述】:

我对 ngIf 指令有疑问。

我的应用程序中有一些角度材质切换是动态生成的,它们都有一个特定的 ID。我想知道,我知道使用 ngIf 指令我可以有条件地在我的页面上显示这些元素。我正在将 ngIf 用于其他函数,但我对如何检查元素的 id 是否存在于数组中有点迷茫。

数组看起来像这样:

["fc-vis", "fc-bis", "fc-dis"]

我的切换器都有 id:fc-vis / fc-bis ... 等等。

我尝试过使用 ngIf,但我不知道如何发送条件中元素的 id...或者我可能做错了什么

我想做的是:

*ngIf="object.id in myArrayList" 

*ngIf="checkIfExists(object.id)"

关于如何在条件中使用对象的 id 来检查它是否存在于该数组中的任何想法?

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    如果你支持现代浏览器,那么你可以在这里使用Array includes() 方法:

    *ngIf="myArrayList.includes(object.id)" 
    
    • includes() 方法确定数组是否在其条目中包含某个值,并根据需要返回 true 或 false。因此调用此方法后无需在此处进行额外检查。

    为了支持IE,你可以在这里使用ArrayindexOf()方法:

    *ngIf="myArrayList.indexOf(object.id) > -1" 
    
    • indexOf() 方法返回可以在数组中找到给定元素的第一个索引,如果不存在,则返回 -1。因此,在调用此方法后,我们还需要额外检查indexOf() 方法返回的值是否大于-1,并基于此*ngIf 将显示或隐藏元素。

    【讨论】:

    • 也考虑@Avinash的回答,IE不支持includes方法。没有 polyfill。
    【解决方案2】:

    你也可以使用数组indexOf()方法,如果数组中没有元素,它返回-1:
    在你的 ts -
    const myArray = ["fc-vis", "fc-bis", "fc-dis"]
    在模板中 -
    *ngIf="myArray.indexOf(object.id) > -1"
    使用 templateRef 获取元素的 id,例如:

    <div id="fc-vis" #myId>
      <p *ngIf="myArray.indexOf(myId?.id) > -1">{{myId.id}} working </p> 
    </div>
    

    【讨论】:

    • 我的问题更像是我怎样才能动态地获取每个元素的对象 id ......类似于 this.id ??
    • 你可以使用模板参考,我在上面的答案中更新了
    • @Avinash 这在我想在用户输入已经存在的数字时向用户显示警告的表单中不起作用。通过 console.log(myArray) 我可以看到 myArray 包含预期的元素(即数字)。您知道可能出了什么问题吗?
    【解决方案3】:

    答案很好,但是我遇到了严格模板检查的问题(或者至少我是这么认为的)

    我正在制作一个通用的高级搜索对话框组件,如果选择了某些字段,则必须隐藏其中的某些字段 - 即。布尔字段,所以我想隐藏 ">=" 比较选择。我有一个函数,它可以像这样获取字段的类型

    getFieldType(criterion) === searchTypes.typeBoolean

    所以我想重构逻辑以支持更多数据类型,这就是我来到这里的原因。问题是 - 在我的情况下 - getFieldType(AbstractControl) can 返回 undefined 并且在输入时没有一个答案(includes()indexOf())对我有用(也尝试过 .includes()):

    *ngIf="[searchTypes.typeString, searchTypes.typeBoolean].indexOf(getFieldType(cr)) !== -1">
    

    它不起作用,因为 includes()indexOf() 都希望参数类型与数组中的类型相同(!)


    在我的情况下,我通过将整个表单转换为 ng-container 来解决它,这样如果方法返回未定义,它就不会呈现 html

    &lt;ng-container *ngIf="getFieldType(cr) as fieldType"&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 2013-07-04
      • 2016-10-28
      • 2018-07-25
      • 2019-06-28
      • 1970-01-01
      • 2020-11-11
      • 2018-06-21
      相关资源
      最近更新 更多