#angular #asynchronous #pipe #angularfire
#angular #асинхронный #канал #angularfire
Вопрос:
У меня действительно простая проблема, но она вызвала у меня часы разочарования.
У меня есть наблюдаемый снимок из angular firebase, который я передаю через функцию map, чтобы изменить некоторые данные.
вот так:
this.itemsList = this.itemsRefList.snapshotChanges().pipe(
map(changes =>
changes.map(c => ({
product: c.payload.key,
firmware: c.payload.child('latest').val(),
ref: c.payload.ref,
})
)
)
);
После завершения работы канала я хотел бы просто вызвать функцию, как я могу этого добиться?
В частности, я использую ngx-admin, и у меня есть карточка, содержимое которой по умолчанию отображается как счетчик загрузки.
<nb-card>
<nb-card-header>
...
</nb-card-header>
<nb-card-body [nbSpinner]="tableDataLoading" nbSpinnerSize="giant" nbSpinnerStatus="warning">
<div *ngIf="itemsList | async as items">
<ng2-smart-table [settings]="settings" [source]="items"></ng2-smart-table>
</div>
</nb-card-body>
</nb-card>
Как только мой список элементов будет заполнен, я хочу вызвать функцию, которая установит для tableDataLoading значение false, чтобы счетчик исчез.
Каков правильный способ сделать это, я много чего перепробовал, включая подписку на ItemsList и попытку вызвать функцию для этого (говорит мне, что это не функция), пытаясь посмотреть, могу ли я как-то изменить переменную в шаблоне html — безрезультатно и т.д. И т.п.
Комментарии:
1. Просто добавьте .tap после карты..
Ответ №1:
Добавьте скобку в функцию changes.map.
this.itemsList = this.itemsRefList.snapshotChanges().pipe(
map(changes =>{
let temp = changes.map(c => ({
product: c.payload.key,
firmware: c.payload.child('latest').val(),
ref: c.payload.ref,
}))
//map is done, call other code here
this.callOtherMethodHere();
return temp;
})
);
Комментарии:
1. если я попробую это, компилятор пожалуется, что тип ‘Observable<void>’ не может быть присвоен типу ‘Observable<any[]>’. Тип ‘void’ нельзя присвоить типу ‘any[]’.
2. Отлично, спасибо за вашу помощь, мне просто пришлось удалить предпоследний; return temp; }); <—этот, чтобы заставить его скомпилироваться