В моем компоненте Angular 2 у меня есть наблюдаемый массив
list$: Observable<any[]>;
В моем шаблоне у меня есть
<div *ngIf="list$.length==0">No records found.</div>
<div *ngIf="list$.length>0">
<ul>
<li *ngFor="let item of list$ | async">item.name</li>
</ul>
</div>
Но list $ .length не работает в случае массива Observable.
Обновить:
Кажется, что (list $ | async) ?. length дает нам длину, но приведенный ниже код все еще не работает:
<div>
Length: {{(list$ | async)?.length}}
<div *ngIf="(list$ | async)?.length>0">
<ul>
<li *ngFor="let item of (list$ | async)">
{{item.firstName}}
</li>
</ul>
</div>
</div>
Может ли кто-нибудь указать, как проверить длину наблюдаемого массива.
angular
observable
angular2-template
angular2-services
Навид Ахмед
источник
источник
Ответы:
Вы можете использовать
| async
трубу:Обновление - угловая версия 6:
Если вы загружаете css Skeleton, вы можете использовать это. Если в массиве нет элементов, он отобразит шаблон css. Если есть данные, заполните
ngFor
.источник
<div *ngIf="(list$ | async)?.length==0">No records found.</div>
(добавлено?
)?
требуется, потому чтоlist$
оно устанавливается только после того, как Angular2 попытается отобразить представление в первый раз.?
предотвращает оценку остальной части подвыражения до тех пор, пока левая часть не?
станет!= null
(Элвис или оператор безопасной навигации).async
канал разрешает данные, и поэтому мой следующийasync
канал в цикле ничего не отображает. Или, может быть,*ngIf
создает дополнительную область, и поэтому она не работает. Трудно сказать. Но пока мой цикл заключен внутри if, он не отображает никаких данных. Если сам оцениваетtrue
правильно.Решение для .ts-файлов:
источник
onDestroy
компонентуДля Angular 4+ попробуйте это
источник
Хотя это правильный ответ
Имейте в виду, что если вы используете http-клиент для вызова серверной части (в большинстве случаев вы это делаете), вы получите дублирующиеся вызовы к вашему API, если у вас есть более одного списка $ | асинхронный . Это потому, что каждый | async pipe создаст нового подписчика в вашем списке $ observable.
источник
Вот что сработало для меня -
Я получаю свои данные из httpClient async.
Все остальные варианты здесь не работали, что меня разочаровало. Особенно секси (list $ | async) канал.
Баса ..
источник
У вашего подхода есть еще одна серьезная проблема: многократно используя асинхронный канал в своем шаблоне, вы фактически запускаете столько подписок на один Observable.
У KAMRUL HASAN SHAHED правильный подход, описанный выше: используйте асинхронный конвейер один раз, а затем укажите псевдоним для результата, который вы можете использовать в дочерних узлах.
источник
Также можно сократить:
Просто используйте восклицательный знак перед скобкой.
источник
ионный 4
это сработало, когда я удалил
$
знакисточник