Как получить доступ к значению из хранилища глобально в Ionic 4? - PullRequest
0 голосов
/ 09 января 2019

У меня есть некоторые значения, которые сохраняются в хранилище sqlite, когда пользователь входит в систему, и мне нужно, чтобы эти значения были доступны во всем приложении.

Я создал сервис для извлечения и хранения этих значений, но он не работает, потому что единственный способ, которым я смог выяснить, как это сделать, это получить значения в обещании, чего я не делаю думаю вернет их за пределы then().

value1: string;
value2: string;

constructor(
    private storage: Storage,
) {
    Promise.all([
        this.storage.get('value1'),
        this.storage.get('value2'),
    ]).then((result) => {
        this.value1 = result[0];
        this.value2 = result[1];
    });
}

Как я могу получить эти значения в моем сервисе, а затем вызвать их на своих страницах следующим образом?

this.value1 = this.myService.value1;

Редактировать: Согласно ответу Сергея Руденко, я создал GlobalService и вызвал код со страницы. Вот код, который я использовал.

GlobalService

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';

@Injectable({
    providedIn: 'root'
})
export class GlobalService {

    public value1: string;

    constructor(private storage: Storage) {
        this.storage.get('value1').then((value) => {
            this.value1 = value;
        });
    }
}

MyPage

import { Component, OnInit } from '@angular/core';
import { GlobalService } from '../../services/global.service';

@Component({
    selector: 'app-index',
    templateUrl: './index.page.html',
    styleUrls: ['./index.page.scss'],
})
export class IndexPage implements OnInit {

    public value1: string;

    constructor(private global: GlobalService) {
        console.log('value1=' + this.global.value1);
        // returns: value1=undefined
    }

1 Ответ

0 голосов
/ 09 января 2019

Вам необходимо создать общую службу (провайдер), которую каждый компонент сможет импортировать и получать доступ к общедоступным переменным (что делает их «глобальными» в основном).

Хранилище асинхронно, и поэтому вы можете присвоить возвращаемые значения обещаний переменным в общем поставщике:

    public globalValue1: string;
    public globalValue2: string;

    constructor(
        private storage: Storage,
    ) {
      this.storage.get('value1').then((value) => { this.globalValue1 = value });
      this.storage.get('value2').then((value) => { this.globalValue2 = value });

    }

Затем в вашем компоненте вы импортируете общего провайдера и получаете доступ к глобальным переменным

UPDATE:

В вашем случае использования кажется, что вы пытаетесь прочитать глобальную переменную, которая еще не получила назначенное значение, как часть асинхронного вызова хранилища. Так как метод конструктора в вашем компоненте вызывается до , значение присваивается - вы видите неопределенное. Теперь, если ваш вариант использования заключается в том, что вы хотите отобразить такое значение в своем шаблоне, вы можете использовать связывание, которое защищает от неопределенных значений: {{foundation.globalVar? }} - знак вопроса будет указывать, что значение может быть недоступно.

Единственный обходной путь, который имеет значение во время вызова конструктора компонента, о котором я сейчас думаю - вы можете рассмотреть возможность сохранения данных в хранилище синхронизации - например, в «локальном хранилище» браузера, но это будет работать, только если ваши данные маленький.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...