對於我的應用程序,ItemDetailComponent
是顯示項目的信息。我有一個使用諾言檢索所有項目的服務。我使用ActivatedRoute
從URL路徑檢索項目ID,然後運行服務,獲取所有項目,然後找到具有上面檢索的ID的項目,並將其分配給selectedItem
變量。如何在組件中的承諾解決後讓Angular 2呈現HTML模板?
這裏是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)
}
}
這裏是item-detail.component.html
模板,所以我可以顯示我的項目,只是一個例子:
<div>
<h1>{{title}}</h1>
<div *ngIf="selectedItem">
<div><label>Item ID: </label>{{selectedItem.itemId}}</div>
</div>
</div>
該應用程序將返回什麼,但不幸的稱號。然後我添加了兩個console.log()
命令,發現承諾之外的一個以及html模板在承諾履行之前呈現,並且當時沒有selectedItem
可用。我應該如何強制應用程序在解決承諾後才執行它們以便顯示selectedItem
?
編輯:我在HTML模板中添加一個新行進一步檢查:
<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>
這個應用程序顯示「項ID 1:」標籤,但沒有實際的ID存在。控制檯向我顯示一個錯誤,說「無法讀取未定義的屬性'itemId',再次確認整個模板在promise解析之前呈現,並且在數據加載後不會重新呈現。太奇怪了。
*「我該如何強制應用程序執行它們,只有在解決承諾後才能執行它們是否顯示了selectedItem?「*。你不需要。模板將自動重新渲染。真正的問題是你得到「內部承諾」日誌和'selectedItem'得到妥善解決? – dfsq
是的,裏面的承諾日誌顯示我很好的項目,我想顯示的細節。 – Duc
是標題屬性綁定好嗎?你可以發佈一個plunkr請致電 – Tsar