Dla mojej aplikacji, ItemDetailComponent
jest tam, gdzie będą wyświetlane informacje o produkcie. Mam usługę, która pobiera wszystkie przedmioty za pomocą obietnicy. Używam ActivatedRoute
, aby pobrać identyfikator przedmiotu ze ścieżki URL, następnie uruchomić usługę, pobrać wszystkie elementy, a następnie znaleźć przedmiot z identyfikatorem, który został pobrany powyżej, i przypisać go do zmiennej selectedItem
.Jak utworzyć szablon HTML Angular 2 po rozwiązaniu obietnicy w komponencie?
Oto item-detail.component.ts
:
export class ItemDetailComponent implements OnInit {
private title = 'Item Details'
private selectedItem: object
constructor(
private route: ActivatedRoute,
private itemService: ItemService
) {}
ngOnInit() {
const selectedItemId = this.route.snapshot.params.itemId
return this.itemService.getAllItems()
.then((items) => {
return _.find(items, item => item.itemId === selectedItemId)
})
.then((selectedItem) => {
this.selectedItem = selectedItem
console.log('Inside promise', this.selectedItem)
})
console.log('Outside promise', this.selectedItem)
}
}
A oto item-detail.component.html
szablon więc może wyświetlać moją pozycję, to tylko przykład:
<div>
<h1>{{title}}</h1>
<div *ngIf="selectedItem">
<div><label>Item ID: </label>{{selectedItem.itemId}}</div>
</div>
</div>
Aplikacja zwraca nic, ale tytuł niestety. Następnie dodałem dwie komendy console.log()
i okazało się, że zarówno poza obietnicą, jak i szablonem html są renderowane przed spełnieniem obietnicy, a w tej chwili nie jest dostępna żadna wersja console.log()
. W jaki sposób mogę wymusić na aplikacji ich wykonanie dopiero po rozwiązaniu obietnicy, aby mieć gotowy numer selectedItem
?
EDIT: Dodałem nową linię w szablonie html badać dalej:
<div>
<h1>{{title}}</h1>
<div><label>Item ID 1: </label>{{selectedItem.itemId}}</div>
<div *ngIf="selectedItem">
<div><label>Item ID 2: </label>{{selectedItem.itemId}}</div>
</div>
</div>
Aplikacja wyświetla "Item ID 1:" etykieta ale bez rzeczywistej id tam. Konsola pokazuje mi komunikat o błędzie "Nie można odczytać właściwości 'itemId' of undefined", ponownie potwierdzając, że cały szablon jest renderowany przed rozstrzygnięciem obietnicy i nie jest ponownie renderowany po załadowaniu danych. Bardzo dziwne.
* "Jak mogę zmusić aplikację do jej wykonania dopiero po rozwiązaniu obietnicy, aby ve wybrany element na miejscu? "*. Nie musisz. Szablon zostanie automatycznie zrerenderowany. Prawdziwym pytaniem jest czy otrzymasz log w "Inside Promise" i 'selectedItem' zostanie poprawnie rozwiązany? – dfsq
Tak, wewnętrzny dziennik obietnic pokazuje mi dokładnie ten przedmiot, który chcę wyświetlić szczegóły. – Duc
to tytuł własności związany ok? możesz opublikować plunkr pls – Tsar