Ionic 2 * ng不承诺承诺(承诺)

时间:2016-12-16 18:30:28

标签: angular ionic2 ngfor

我试图在我的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);                    
        }
      });
    });
  });

}

1 个答案:

答案 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);
      }
    });
  }
}