如何在Angular 2+模板中使用isArray()?

时间:2016-06-07 11:55:35

标签: javascript angular typescript

我有一个名为records的变量,

现在我想在angular2 / typescript中检查它是否是一个数组?

在AngularJS中,我曾经做过以下事情:

ng-if="selectedCol.data && !isArray(selectedCol.data)"

但是当我试图做以下事情时它不起作用;

*ngIf="selectedCol.model.data && !Array.isArray(selectedCol.model.data)"

它给我以下错误:

  

TypeError:无法读取属性' isArray'未定义的   任何输入?

3 个答案:

答案 0 :(得分:17)

Angular 2模板在Component的上下文中执行,这意味着,您只能访问Component中定义的属性/方法

最简单的方法是在isArray

中定义Component方法
isArray(obj : any ) {
   return Array.isArray(obj)
}

在模板中

*ngIf="isArray(selectedCol.model.data)"

要避免使用样板代码,请使用isArray方法定义服务,注册为Singleton,注入Component并通过服务属性使用isArray方法

或者,在_array中定义Component属性并为其指定Array类型

  private _array = Array;

在模板中

*ngIf="_array.isArray(selectedCol.model.data)"

答案 1 :(得分:5)

除了@tchelidze所说的:

Angular 2在facade/lang中提供了一个名为isArray的包装器,导出并定义如下:

export function isArray(obj: any): boolean {
  return Array.isArray(obj);
}

您可以将其导入您的组件,如下所示:

import {isArray} from '@angular/facade/lang';

然后,您可以在组件中公开公开它:

this.isArray = isArray

并在您的模板中使用如下:

*ng-if="selectedCol.data && !isArray(selectedCol.data)"

答案 2 :(得分:3)

虽然不是最有效的解决方案(参见其他答案),[].constructor.isArray适用于任何表达式上下文,并且不需要使用语言级帮助程序污染组件类:

*ngIf="selectedCol.model.data && [].constructor.isArray(selectedCol.model.data)"