【问题标题】:Check in template if variable is an array, string, number如果变量是数组、字符串、数字,则签入模板
【发布时间】:2019-01-16 11:18:36
【问题描述】:

我在父 component.ts 文件中有一个如下所示的 items 数组

items = [
    {text: 'Length' , value: 10 },
    {text : 'Degree' , value : "108"},
    {text : 'Edges' , value : [10,20,30]}
]

然后我有一个名为 app-label-values 的组件放置在父组件的 *ngFor 循环中,如下所示

<div *ngFor ="let item of items">
  <app-label-values
   label="item.text"
   value = "item.value">
  </app-label-values>
</div>

app-label-values 组件目的是显示标签和标签对应的值。

例如。年龄:10

这里的标签总是一个文本,而值的类型可以是动态的(数字、字符串、数组)

所以当值是数组类型时,我只需要显示数组的长度,就像在我们的例子中组件应该显示“边:3”,因为 [10,20,30].length 是 3。

我的目标不是在 app-label-values 组件中使用这种类型检查逻辑,因为我需要它是愚蠢的并且只显示传递给它的内容。

如何在渲染时从父组件本身解决这个问题。

请帮助。在此先感谢。

【问题讨论】:

  • value = "item.value.length" ??
  • @GeorgeBailey 这对于数字类型值不起作用, value.length 会抛出错误,即使我将数字转换为字符串并对其应用长度,它也会给我带来不希望的结果。例如。 '10'.length = 2
  • 好的。我并没有真正尝试过,但您可以通过value = "item.value.constructor == Array ? item.value.length : item.value" 进行检查
  • 谢谢乔治,构造函数检查对我来说似乎是一种更清洁的方法。谢谢:)
  • value = "item.value.push ? item.value.length : item.value"。我这样做了,它也适用于模板,因为 push 方法只属于数组原型。但是我希望我能得到比这更好的解决方案。

标签: javascript angular typescript ecmascript-6 angular5


【解决方案1】:

您可以使用ngIf 来检查item.value 是否具有长度属性。 在父组件中,您仍然可以传递给子组件item.value,而在子组件中,您可以根据它是数组还是数字来显示值

  1. 检查长度属性
   <div *ngIf="item.value?.length > {{item.value.length}} </div>

如果你想直接将数组的长度传递给你的子组件,你可以考虑使用三元运算符

value="item.value?.length ? item.value.length : item.value"

如果要检查字符串值,首先检查是否有长度属性。然后可以使用+ 运算符来解析字符串。并且使用第二个三元运算符,您可以检查它是数字还是数组

value="item.value?.length ? +item.value ? item.value : item.value.length : item.value" 
  1. 检查构造函数名称
value="item.value.constructor.name === "Array" ? item.value.length : item.value"

使用构造函数,还可以检查值是否为字符串、数字等。live code

【讨论】:

  • 遇到字符串值时可能会失败,因为数组和字符串都有长度属性。例如。 [10,20,30].length = 3; '10'.length = 2
  • 在您的问题中,您说它是数字或数组。如果是字符串,可以先解析成数字
  • edkeveked - 正如@George 所提到的,通过构造函数检查似乎更干净,因为我们不必担心解析字符串和数字。仅在构造函数为数组时显示长度,否则按原样显示。如果我错了,请纠正我。
  • value = "item.value.push ? item.value.length : item.value"。我这样做了,它也适用于模板,因为 push 方法只属于数组原型。但是我希望我能得到比这更好的解决方案。
  • 我编辑了答案。我添加了如何直接使用构造函数进行检查
【解决方案2】:

您可以在 angular 4 及以上的模板中使用 if Else 语句...

<div *ngFor ="let item of items">
    <app-label-values *ngIf="item.value.length >= 0; else elseIfTemp" label="item.text" value = "item.value.length"> </app-label-values>
    <app-label-values label="item.text" value = "item.value" #elseIfTemp> 
    </app-label-values>
</div>

【讨论】:

    【解决方案3】:

    您可以编写一个方法来检测类型并相应地返回

    这是一个例子

    <div *ngFor ="let item of items">
      <app-label-values
       label="item.text"
       value = "checkType(item.value)">
      </app-label-values>
    </div>
    

    在 .ts 文件中

    checkType(value){
      if(typeof value === 'object'){
        return value.length;
      }else{
        return value;
      }
    }
    

    here's 是一个例子

    【讨论】:

    • 感谢 Aniket。但是,在模板中调用方法不是一种不好的做法,因为该方法被调用了太多次。?如果我错了,请纠正我。
    • 是的,但是如果您检查 html 中的长度,那么它也会给出字符串值的长度。这就是我使用方法的原因。你是对的,这个方法会被调用多次作为数组长度。
    • 正如@George 所说,通过构造函数检查似乎更干净,因为我们不必担心字符串和数字。仅当构造函数为数组时显示长度,否则按原样显示。
    • 是的,我试过了,但它没有用。所以我找到了一个修复,因为 value = "item.value.push ? item.value.length : item.value"。我这样做了,它适用于模板也是如此,因为 push 方法只属于数组原型。但是我希望我能得到比这更好的解决方案。
    猜你喜欢
    • 2017-12-19
    • 2021-01-26
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2012-03-07
    • 2022-06-29
    相关资源
    最近更新 更多