对于我的应用程序,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