Как использовать isArray() в typescript?
У меня есть эта переменная с именем records
,
Теперь я хочу проверить, не массив или нет в angular2/typescript?
В AngularJS, который я раньше делал:
ng-if="selectedCol.data && !isArray(selectedCol.data)"
Но когда я пытаюсь сделать следующее, это не работает;
*ngIf="selectedCol.model.data && !Array.isArray(selectedCol.model.data)"
Это дает мне ошибку ниже:
TypeError: Невозможно прочитать свойство isArray из undefinedлюбые входы?
Ответы
Ответ 1
Angular 2 шаблон выполняется внутри Component
контекста, то есть вы можете получать доступ только к свойствам/методам, определенным внутри Component
Самый простой способ - определить метод isArray
в Component
isArray(obj : any ) {
return Array.isArray(obj)
}
В шаблоне
*ngIf="isArray(selectedCol.model.data)"
Чтобы избежать кода шаблона, определите Service с методом isArray
, зарегистрируйтесь как Singleton, введите в Component
и используйте метод isArray
через свойство службы
Альтернативно, определите свойство _array
в Component
и присвойте ему Array
private _array = Array;
В шаблоне
*ngIf="_array.isArray(selectedCol.model.data)"
Ответ 2
В дополнение к тому, что сказал @tchelidze:
Angular 2 предоставляет оболочку с именем isArray
в facade/lang
, экспортированную и определенную следующим образом:
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)"
Ответ 3
Не будучи наиболее эффективным решением (см. другой ответ), [].constructor.isArray
подходит для любого контекста выражения и не требует заражения классов компонентов с помощью помощников на уровне языка:
*ngIf="selectedCol.model.data && [].constructor.isArray(selectedCol.model.data)"