我有home.ts,它正在调用service.ts来从Storage中加载项目。
export class HomePage {
products;
ionViewDidEnter() {
this.products = this.productService.products;
}
ngOnInit(){
this.productService.fetchProducts();
this.products = this.productService.products;
}
}
export class ProductService{
products;
fetchProducts(){
this.storage.get('products') // returns a promise which returns data or error
.then(
(products) => {
// assign to this.expenses only if not null. When first //strt, can be null. If null, assign empty array []
products? this.products = products : this.products = [];
console.log("fetch Products:" + this.products);
return this.products;
})
.catch(
err => console.log(err)
);
}
然后我在home.html
中渲染项目。
问题是,应用程序启动时第一次不显示项目。但是,如果我导航到另一个屏幕并返回home.ts,那么这些项目将被渲染回来。我知道这是因为ionViewDidEnter,也许是第一次,fetchProducts中的promise是异步的。但是如何在ngOnInit
上第一次列出要列出的项目?
答案 0 :(得分:2)
处理异步问题的一种方法是在回调中执行操作:
ngOnInit(){
this.productService.fetchProducts()
.then((res)=>{
this.products = this.productService.products;
});
}
您还应在此处添加return
语句:
fetchProducts(){
return this.storage.get('products') // returns a promise which returns data or error
.then(..
以下是一个有关的例子:http://plnkr.co/edit/ONOg4FChJpCG81gM7Vlt?p=preview
答案 1 :(得分:0)
如我所见,你可以用两种不同的方式做到这一点......
首先修改方法,以便typescript知道它返回一个带有产品列表的promise:
fetchProducts(): Promise<Array<any>> {
// ...
}
1)预加载一次信息:所以你只需要调用一次fetchProducts
方法(可能是在启动时),以便将产品加载到内存中,然后你就可以了使用products
属性获取数据
// In your app.component.ts
@Component({
templateUrl: 'app.html'
})
export class MyApp {
public rootPage: any; // Don't assign the page here yet
constructor(private platform: Platform,
private productService: ProductService) {
this.platform.ready().then(() => {
// ...
this.productService.fetchProducts().then(() => {
this.rootPage = HomePage;
});
});
}
然后在HomePage中,由于数据已经在内存中,您可以使用服务中的products
属性:
export class HomePage {
products;
ionViewDidEnter() {
this.products = this.productService.products;
}
}
2)每次用户进入主页时从存储中获取产品:
export class HomePage {
products;
ionViewDidEnter() {
this.productService.fetchProducts().then((products) => {
this.products = this.productService.products;
});
}
}