Значение Ionic Storage не будет отображаться в HTML, пока страница не будет перезагружена.

Значения Ionic Storage не отображаются в HTML, пока страница не будет перезагружена. Я посмотрел на некоторых других людей, у которых были те же проблемы, но решения, которые я нашел, либо не работают, либо больше не работают из-за изменений версии Ionic. Примером может служить система событий в Ionic.

HTML: отображает имя и две даты

<ion-list>
    <div *ngFor="let data of data2">

    <ion-item lines="none">
        <ion-label text-left>
          Fruit Name:
        </ion-label>
        <ion-label text-right>
          {{data.FruitName}}
        </ion-label>
    </ion-item>

    <ion-item lines="none">
      <ion-label text-left>
        Install Date:
      </ion-label>
      <ion-label text-right>
        {{data.installTime}}
      </ion-label>
    </ion-item>

    <ion-item>
      <ion-label text-left>
        Remove Date:
      </ion-label>
      <ion-label text-right>
        {{data.removeTime}}
      </ion-label>
    </ion-item>


    </div>

</ion-list>

.TS

import {ActivatedRoute} from '@angular/router';
import { Storage } from '@ionic/storage';


export class SummaryComponent implements OnInit {

 //My Variables

 data2;
 _idx;

constructor(
private route: ActivatedRoute,
private storage: Storage,
) { }

ngOnInit() {
this.route.params.subscribe(
  params => {

      /*Update Variables here*/

      this._idx = Temperature.__idx;
      this.storage.ready().then(() => {
        this.storage.get(this._idx).then(data=>{
          //if data exists
          if(data)
            {
             console.log("data read");
             this.data2 = data;
             console.log(data);
            }
            else
            {
              console.log("data is empty");
              this.data2 = [];
            }
        });
      });
  });
}

}

Когда я впервые загружаю страницу маршрутизации

введите описание изображения здесь

Когда я меняю страницу маршрутизации, возвращаюсь к исходной.

введите описание изображения здесь


person win4win    schedule 06.03.2020    source источник


Ответы (1)


В вашем файле .ts сделайте это,

import {
    ActivatedRoute
} from '@angular/router';
import {
    Storage
} from '@ionic/storage';
import {
    ChangeDetectorRef
} from '@angular/core';


export class SummaryComponent implements OnInit, OnDestroy {

    //My Variables
    routeParams;
    data2;
    _idx;

    constructor(
        private route: ActivatedRoute,
        private storage: Storage,
        private changeRef: ChangeDectetorRef
    ) {}

    ngOnInit() {
        this.routePrams = this.route.params.subscribe(params => /** ... do whatever you need to do in here that involves params **/);

        this._idx = Temperature.__idx;                                                    
        this.storage.get(this._idx).then(data=>{
          //if data exists
          if(data)
            {
             console.log("data read");
             this.data2 = data;
             console.log(data);
            }
            else
            {
              console.log("data is empty");
              this.data2 = [];
            }
            this.changeRef.detectChanges();
        });
    }

    ngOnDestroy() {
        this.routeParams.unsubscribe();
    }

}

Объяснение: я не знаю, почему вы используете storage.ready(), в этом нет необходимости. Я не знаю, почему вы делаете вызов хранилища внутри наблюдаемого, который никогда не используется в вызове хранилища; разделите их (если вы не используете переменную param). Вам необходимо отказаться от подписки на каждую сделанную вами подписку; сделайте это, иначе вы рискуете утечкой памяти на стороне клиента.

В вашем шаблоне .html сделайте это,

<ion-list *ngIf="data2">
    <div *ngFor="let data of data2">

        <ion-item lines="none">
            <ion-label text-left>
                Fruit Name:
            </ion-label>
            <ion-label text-right>
                {{data.FruitName}}
            </ion-label>
        </ion-item>

        <ion-item lines="none">
            <ion-label text-left>
                Install Date:
            </ion-label>
            <ion-label text-right>
                {{data.installTime}}
            </ion-label>
        </ion-item>

        <ion-item>
            <ion-label text-left>
                Remove Date:
            </ion-label>
            <ion-label text-right>
                {{data.removeTime}}
            </ion-label>
        </ion-item>


    </div>

</ion-list>

Объяснение. Поскольку ваш результат хранения представляет собой объект, похожий на обещание, вам нужно подождать, пока он не разрешится. Вы можете сделать это, выполнив проверку шаблона состояния переменной data2, которую вы пытаетесь установить с помощью вызова хранилища. Первоначально он не установлен, но после разрешения вызова хранилища он устанавливается. Это разрешение может произойти за пределами хуков жизненного цикла angular, поэтому вы видите страницу сначала пустой, а затем, когда вы перезагружаете, она работает нормально.

person haron68    schedule 06.03.2020
comment
Спасибо за ответ, но это также дает те же результаты, когда страница не загружается. В конечном итоге данные загружаются, когда я сижу на странице, которую могу просмотреть в консоли инспектора (f12). Но HTML-страница не изменяется даже с * ngIf = data2 после того, как data2 был установлен. - person win4win; 09.03.2020
comment
Значит, данные загружаются, а вы не покидаете страницу и не возвращаетесь, это происходит через некоторое время? - person haron68; 09.03.2020
comment
Да, в ngOnInit () у меня есть console.log (data); который показывает данные и все значения, которые они содержат в консоли. Несмотря на то, что data2 установлен со значениями, страница HTML не отображает это, если я не изменю страницу маршрутизации, а затем вернусь. - person win4win; 09.03.2020
comment
@ win4win пробовали ли вы использовать ссылку на указатель углового изменения angular.io/api/core/ChangeDetectorRef. Это позволяет вам заставить angular проверять ваш компонент на наличие изменений в данных и обновлять шаблон. Я отредактировал свой ответ, чтобы отразить изменения. - person haron68; 09.03.2020
comment
ЭТО РАБОТАЛО, alligator.io/angular/change-detection-strategy ChangeDectors просто что мне было нужно! Спасибо!! - person win4win; 09.03.2020