【发布时间】:2017-09-13 05:25:09
【问题描述】:
在我的项目中,我有一个服务应该在应用启动时加载本地数据库。为此,使用了函数GetData()。我尝试通过调用ngOnInit() 生命周期挂钩来使用它。它将结果记录在控制台中,但属性 datum 似乎没有改变。
但是,如果我将GetData() 方法添加到按钮,则属性会更改并且数据会按预期显示在控制台中。
我查看的所有资料都表明,如果我需要立即加载数据库,正确的方法是使用 ngOnInit() 钩子,这就是为什么当来自 DOM 的某些事件时我不想调用 GetData()被解雇了。
组件
export class AppComponent implements OnInit {
datum;
constructor(private searchService: SearchService){ }
getData(){
this.searchService.getData().subscribe(
data => {
this.datum = data[0];
console.log(this.datum);},
err => console.log("E", err)
);
}
ngOnInit(){
this.getData();
}
title = 'app';
}
HTML
<div style="text-align:center">
<h1>
Welcome to {{title}}!!
Data: {{datum | json}}
</h1>
<button (click)="getData()">Click Me</button>
应用已加载
点击按钮
编辑
按照 AlexKhymenko 的建议,使用 setTimeout() 实现 getData()
getData(){
this.searchService.getData().subscribe(
data => {
setTimeout(() =>{
this.datum = data[0];
});
console.log(this.datum);},
err => console.log("E", err)
);
}
【问题讨论】:
-
我会在这种情况下使用吸气剂:
get Datum() { return this.datum; };,在视图中:Data: {{Datum}}。数据不显示可能有多种原因:zone.js 未触发,或者其他原因。您也可以尝试使用Zone.run,不过它应该已经用getter 修复了。此外,始终初始化类属性,如果理论上需要在视图中显示,请不要将其保持未定义。 NgZone 参考:angular.io/api/core/NgZone。或者,直接绑定到 dom 中的 getData,并返回 observable,然后添加 |异步 -
我不太明白。 “getter”的目的和实现是什么?它只是一个返回
datum的函数吗?什么时候调用? -
@briosheje 也许直接绑定到
getData()是解决方案,因为我使用datum只是因为我没有完全掌握可观察对象的概念。我该怎么做?它应该看起来像 {{ searchService.getData() 吗? |异步}}? -
@briosheje 尝试使用 getter。似乎无所作为。我做对了吗?我在 HTML 中添加了
get Datum() {return this.datum;}并绑定到Datum而不是datum -
getter 应该不断更新视图,除非
zone.js有问题。在这种情况下,您需要运行包装在 zone.run 中的代码(在线查看)。否则,您可以通过引用 observable 来使用async管道。无论如何它应该在没有异步的情况下工作,并且应该已经工作,你应该真正检查你的代码在其他地方是否有其他错误,无论是在视图中,还是在其他地方;)
标签: javascript angular observable