Где сохранить настройки, такие как URL-адрес API, в приложении Ionic2?

У меня есть несколько настроек, которые должны быть в файле конфигурации.

Например: URL API

Где лучшее место для него в Ionic 2?


person rakete    schedule 13.08.2016    source источник


Ответы (3)


Из документов Angular 2/4:

Неклассовые зависимости

Что, если значение зависимости не является классом? Иногда мы хотим внедрить строку, функцию или объект.

Приложения часто определяют объекты конфигурации с множеством мелких фактов (таких как название приложения или адрес конечной точки веб-API), но эти объекты конфигурации не всегда являются экземплярами класса.

Одним из решений выбора токена поставщика для неклассовых зависимостей является определение и использование OpaqueToken.

Таким образом, вам нужно будет определить объект конфигурации с URL-адресами и т. Д., А затем OpaqueToken, чтобы иметь возможность использовать его при внедрении объекта с вашей конфигурацией.

Я включил всю свою конфигурацию в файл app-config.ts

// Although the ApplicationConfig interface plays no role in dependency injection, 
// it supports typing of the configuration object within the class.
export interface ApplicationConfig {
  appName: string;
  apiEndpoint: string;
}

// Configuration values for our app
export const MY_CONFIG: ApplicationConfig = {
  appName: 'My new App',
  apiEndpoint: 'http://www...'
};

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new OpaqueToken('config');

Что такое OpaqueToken, может сначала сбить с толку, но это всего лишь строка, которая позволит избежать конфликтов имен при внедрении этого объекта. Вы можете найти замечательный пост об этом здесь.

Затем вам просто нужно включить его на нужную страницу следующим образом:

import { NavController } from 'ionic-angular/index';
import { Component, OpaqueToken, Injectable, Inject } from "@angular/core";

// Import the config-related things
import { MY_CONFIG_TOKEN, MY_CONFIG, ApplicationConfig } from 'app-config.ts';

@Component({
  templateUrl:"home.html",
  providers: [{ provide: MY_CONFIG_TOKEN, useValue: MY_CONFIG }]
})
export class HomePage {

  private appName: string;
  private endPoint: string;

  constructor(@Inject(MY_CONFIG_TOKEN) private config: ApplicationConfig) {
    this.appName = config.appName;
    this.endPoint = config.apiEndpoint;
  }
}

Обратите внимание, как включить его в массив providers

providers: [{ provide: MY_CONFIG_TOKEN, useValue: MY_CONFIG }]

И как сообщить инжектору, как он должен получить экземпляр объекта конфигурации

@Inject(MY_CONFIG_TOKEN) private config: ApplicationConfig

ОБНОВЛЕНИЕ

OpaqueToken устарел, начиная с версии 4.0.0, поскольку он не поддерживает информацию о типе, вместо этого используйте InjectionToken<?>.

Итак, вместо этих строк:

import { OpaqueToken } from '@angular/core';

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new OpaqueToken('config');

Теперь мы должны использовать

import { InjectionToken } from '@angular/core';

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new InjectionToken<ApplicationConfig>('config');
person sebaferreras    schedule 14.08.2016

Сохраните их в синглтоне класса (как правило, это анти-шаблон) или даже в лучшем эквиваленте пространства имен.

class Singleton {
    /* ... lots of singleton logic ... */
    public someMethod() { ... }
}

// Using
var x = Singleton.getInstance();
x.someMethod();

Эквивалент пространства имен

namespace Singleton {
    export function someMethod() { ... }
}
// Usage
Singleton.someMethod();
var x = Singleton; // If you need to alias it for some reason
person user1275105    schedule 13.08.2016
comment
Это кажется намного проще и читабельнее, чем инъекция, как предполагает angular. Может быть, использовать постоянный статический в классе - person misha130; 15.08.2016
comment
если вы используете его как провайдера в bootstrap(), то он автоматически становится одноэлементным. Не нужно использовать какие-либо getInstance() методы. - person Jagannath; 17.08.2016

Вы можете использовать либо таблицу WebSQL, либо таблицу SQLite, либо LocalStorage, поскольку оба метода очень хорошо поддерживаются платформами Ionic и гибридных приложений.

person jjyepez    schedule 13.08.2016
comment
Настройки очень статичны. Может быть, мне не нужно менять их в любое время. Так почему я должен использовать SQL? Каковы его преимущества по сравнению с файлом xml или json? - person rakete; 14.08.2016
comment
Используя SQLite или WebSQL на основе навигатора, ваши настройки будут содержаться и управляться в контексте навигатора, и они, вероятно, будут сброшены или повторно инициализированы, поскольку управление приложением осуществляется через раздел настроек на смартфоне (очистить кеш и т. д.), как и предполагалось. быть, при использовании внешних файлов они не изменятся в отношении управления смартфоном изменения настроек приложения, а будут явно сброшены или повторно инициализированы из инструкций вашей программы, что может не быть обычным поведением приложения. Тем не менее, вы можете использовать тот метод, который лучше всего подходит для вашего приложения. - person jjyepez; 14.08.2016
comment
Я думаю, вы меня неправильно поняли. Я не хочу сохранять настройки пользователей. Я хочу сохранить настройки среды, которые никогда не меняются при публикации приложения. Внутренние настройки, такие как URL-адрес API на мой собственный сервер для получения данных и так далее... - person rakete; 14.08.2016
comment
Есть еще одно отличие, которое вы можете учитывать: при сохранении настроек во внешнем файле вам потребуется разрешение на чтение/запись хранилища от ОС/пользователя (для хранения нескольких статических значений), в то время как при использовании SQL или даже Localstorage вы не можете этого сделать. - person jjyepez; 14.08.2016