*ng, потому что просто не работает с массивом объектов
У меня есть код TS
getItems().subscribe(val=>{
this.items=val;
})
который отлично работает. Когда я console.log(this.items) я получаю
"array:0{size:XL,quantity:1}"
Бууут. Удивительно, но то, с чем я никогда раньше не сталкивался в angular, когда я запускаю код в html-шаблоне
<div *ngFor="let item of items">
{{item.size}}
</div
items =[{size:'XL', количество:4}] Я АБСОЛЮТНО НИЧЕГО не получаю. Это действительно странно, потому что я написал сотни таких заявлений и никогда раньше не сталкивался с этой проблемой. Помогите, пожалуйста.
Решено:
Я понял, что вызов getItems() с объектом, где метод getItems возвращает объект asobservable, может выполняться ТОЛЬКО в том же компоненте, непосредственно после заполнения объекта. Заполнение темы до изменения страницы, похоже, все еще позволяет передавать данные достаточно для входа в консоль, но не для использования более крупным приложением.
Итак, делая
updateItems(items);
getItemsUpdated().subscribe(val=>{
this.items=val
})
где есть тема и
updateItems(items:items){
this.subject.next(items)
}
getItemsUpdated(){
return this.subject.asObservable()
}
будет работать, но только при вызове непосредственно рядом друг с другом в одном и том же компоненте.
Поскольку в этом случае я обновлял тему, переключал страницы, а затем вызывал тему, я испытывал странную неопределенность темы, когда консоль все еще могла записывать значение, переданное субъекту, но это не разрешалось полностью принимающим компонентом и, следовательно, не работал с *ngFor.
Правильный поток
updateItems(items);
---------->Navigate to next page-------->
getItemsUpdated().subscribe(val=>{
this.items=val
})
где есть тема поведения и
updateItems(items:items){
this.behaviorSubject.next(items)
}
getItemsUpdated(){
return this.behaviorSubject.asObservable()
}
В этом случае использование BehaviorSubject вместо Subject позволило корректно обрабатывать данные «вовремя» и работать с приложением. Спасибо всем за ваш вклад!
3 ответа
Вы должны использовать
BehaviorSubject
или
ReplaySubject
; простой
Subject
предоставит вам только значения, выданные после подписки.
export class CartService {
public cartUpdated: Subject<Item[]> = new BehaviorSubject([]);
Дополнительная информация в: Subject vs BehaviorSubject vs ReplaySubject в Angular
Вы можете ничего не делать, пока не получите результаты своего http-запроса.
<div *ngIf="items">
<div *ngFor="let item of items">
{{item.size}}
</div>
</div>
или даже вы можете использовать
async
трубка
<div *ngFor="let item of items | async">
{{item.size}}
</div>
Ваш stackblitz не позволяет ngFor, поэтому установка должна быть неправильной. Вот в чем, я думаю, проблема:
В вашем приложении странный поток данных: когда вы подписываетесь на наблюдаемый объект, вы не получите никаких данных, пока что-то не вызовет следующий вызов по вашей теме. Судя по тому, что я видел в вашем stackblitz, вы, кажется, делаете:
- Вызов обновления, который даст значение вашей теме
- Ты подписываешься и уже поздно
Вы не можете получить последнее значение от темы, и, поскольку вы подписались слишком поздно, ваш console.log из подписки на самом деле ничего не делает. Вы видите console.log, связанный с вашим обновлением (то, что из компонента hello)