Как сохранить данные в массиве из Ionic - this.array.push не является функцией - PullRequest
0 голосов
/ 16 ноября 2018

Массив storedArr = [] используется для хранения данных с использованием хранилища, однако я получаю .push is not a function, когда пытаюсь заполнить его с помощью метода get storage:

storedArr = this.storage.get('stored') ? this.storage.get('stored').then((e) => {e}) : [];

Необходимая часть моегокод:

import { Storage } from '@ionic/storage';

export class MyPage {
    constructor(
        private storage: Storage) {
    }

    // storedArr = []; This works but resets the array

    storedArr = this.storage.get('stored') ? this.storage.get('stored').then((e) => {e}) : [];

    saveToStorage() {
        this.storedArr.push({ // .push is not a function
          title: 'blabla',
          body: 'more blabla'
        });

        this.storage.set('stored', this.storedArr);
    }
}

Как мне написать эту часть кода?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ionic this.storage.get на самом деле не возвращает никакого значения, кроме обещания, на которое затем нужно «подписаться».

Таким образом, storedArr = this.storage.get('stored') ? this.storage.get('stored').then((e) => {e}) : []; при успехе фактически сохраняет обещание внутри storedArr тогдапри неудаче он все еще возвращает обещание.Отсюда и ошибка - потому что Promise.prototype не содержит метод push.Таким образом, троичный оператор оценивает true, и поэтому [] будет не назначаться storedArr.

Для того, чтобы получить значение Ionic this.storage.get('stored'), у вас есть«подписаться» на возвращенное обещание, а затем назначить параметр data для storedArr.Вот так ...

export class MyPage {
  storedArr = [];

  constructor(private storage: Storage) {
      this.storage.get('stored')
          .then(data => {
            this.storedArr = data;
          });
  }

  saveToStorage() {
      this.storedArr.push({ // .push is not a function
        title: 'blabla',
        body: 'more blabla'
      });

      this.storage.set('stored', this.storedArr);
  }
}
0 голосов
/ 16 ноября 2018

Если вы храните что-то отличное от простого примитива, вам, скорее всего, нужно будет сделать JSON.parse() для результата получения хранилища.Что-то вроде ниже.Я настроил использовать await (вместо ваших then s), что, на мой взгляд, гораздо понятнее.

var storageResult = await this.storage.get('stored');
storedArr = (storageResult) ? JSON.parse(storageResult) : [];

Кроме того, когда вы сохраняете массив, вы, вероятно, захотите сделать на нем JSON.stringify.

this.storage.set('stored', JSON.stringify(this.storedArr));
...