我试图在我的Ionic 2应用程序中加载一些消息,并将它们存储在SqLite数据库中,以避免多次下载它们。
所以基本上我问我的Sqlite最后保存的ID,然后向服务器询问比该ID更新的所有消息,然后用保存的消息填充电路板,直到我达到20条消息(显然只有一个电话)。
技术部分:我将所有这些消息放在一个数组中,应该在应用程序中显示* ngFor。当我在PC上运行应用程序时,它显示正确(所以逻辑是正确的),但是当我在电话上运行应用程序时,如果* ngFor没有刷新并且消息是没有显示。
顺便说一句,并非总是如此。如果我卸载页面,我会看到消息(数组最终显示在* ngFor中),如果我再次加载它会显示它们(不是因为现在它们已保存,但因为它们已经在某些缓存中了想)。答案是:我错过了* ngFor的限制?我怎样才能让消息始终显示?我已经将消息限制从100降低到20,但它没有解决问题。
这是代码,有三个承诺:
的getMessages(){ this.dbService.getLastMessageId()。then((data)=> {
let lastId = 0;
if (data.res.rows.length > 0)
lastId= data.res.rows.item(0).Id;
this.http.get(URL+lastId)
.subscribe(data => {
var response = data.json();
let newMessagesCount = response[0].count;
for (let i =1; i<=newMessagesCount; i++)
this.messages.push(response[i]);
if (newMessagesCount <20)
this.dbService.getOldChatMessages(20-newMessagesCount).then((data) => {
if (data.res.rows.length > 0){
let rowsCount = data.res.rows.length;
for (let i=0; i<rowsCount;i++){
let newElement = {
Name: data.res.rows.item(i).Name,
Date: data.res.rows.item(i).mexDate,
Text: data.res.rows.item(i).mexText,
Id: data.res.rows.item(i).Id,
New: 0
};
this.messages.push(newElement);
}
}
//HERE I EXPECT THE ARRAY TO BE READY
if(newMessagesCount>0){
this.dbService.storeNewChatMessages(response);
}
});
});
});
}
答案 0 :(得分:0)
尝试将for循环放在这样的区域中:
import { NgZone } from '@angular/core';
export class MyPage {
zone: NgZone;
constructor() {
this.zone = new NgZone({enableLongStackTrace: false});
}
getMessages() {
this.zone.run(() => {
for (let i =1; i<=newMessagesCount; i++) {
this.messages.push(response[i]);
}
});
this.zone.run(() => {
for (let i = 0; i < rowsCount; i++) {
let newElement = {
Name: data.res.rows.item(i).Name,
Date: data.res.rows.item(i).mexDate,
Text: data.res.rows.item(i).mexText,
Id: data.res.rows.item(i).Id,
New: 0
};
this.messages.push(newElement);
}
});
}
}