我正在学习Angular2。我有一个带有变量的组件,它是一个对象。
我正在迭代对象的字段,并根据该位置的数据类型,我需要渲染一个不同的组件。
在这种情况下,如果label
该位置为typeof
,我想要number
如果这不起作用
<div>
<div *ngIf='obj'>
<label *ngFor="let key of keys; let i = index">
<label class='key'>{{key}}:</label>
<label class='number' *ngIf='typeof obj[key] === "number"'>
<!-- label class='number' *ngIf='obj[key] | typeof === "number"' -->
{{ obj[key] }}
</label>
</label>
</div>
</div>
有什么想法吗?
我还创建了一个管道,以便在打印值时使typeof
工作,但不在* ngIf
答案 0 :(得分:59)
模板中不提供window
,typeof
,枚举或静态方法等全局变量。只有组件类和打字稿语言结构的成员可用。
您可以向组件添加辅助方法,例如
isNumber(val) { return typeof val === 'number'; }
并像
一样使用它<label class='number' *ngIf='isNumber(obj[key])'>
答案 1 :(得分:16)
您可以创建简单的管道,该管道将接收当前物料并返回物料类型。
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'typeof'
})
export class TypeofPipe implements PipeTransform {
transform(value: any): any {
console.log("Pipe works ",typeof value);
return typeof value;
}
}
现在您可以像这样在html中使用typeofpipe
*ngIf = (item | typeof) === 'number'"
在HTML as mentioned above中使用函数调用时要小心。首选使用管道代替函数调用。这是Stackblitz的示例。在第一种情况下,将在检测到任何更改时触发函数调用(例如单击按钮)。
答案 2 :(得分:12)
答案 3 :(得分:2)
这有点像黑客攻击,但是如果你需要在很多地方做到这一点并且不想要通过一些isNumber
功能,那么还有其他选择如果你仔细使用它可以工作。
您可以检查对象prototype
上存在的属性或方法是否存在,或者您要查找的类型。例如,所有数字都有toExponential
函数,所以:
<label class='number' *ngIf='obj[key] && obj[key].toExponential'>
对于函数,您可以查找call
,查找可以查找toLowerCase
的字符串,查找可以查找concat
的数组等等。
这种做法根本不是万无一失的,因为你可能有一个object
碰巧拥有一个与你要检查的同名的财产(尽管这个属性是你的&#39;你需要重新检查,然后我们基本上duck typing),但是如果你知道你拥有的价值是一个原始的,你就会处于良好的状态,因为你无法分配原语的属性(这个主题是some interesting reading)。
免责声明:我不相信这是一个好主意,并且可能不是非常易于维护或移植,但如果您只需要快速的原型或非常有限的用例,这是一个合理的工具在你的腰带。
答案 4 :(得分:1)
我刚试过这个,发现它在生产中不起作用,因为缩短了函数名。使用类似的东西会更安全:
foo instanceof FooClass
但请注意,您必须在组件/指令中执行此操作,因为instanceOf
在模板中不可用:
// In your component
isFoo(candidate){
return candidate instanceOf FooClass;
}
// in your template
{{isFoo(maybeFoo)}}