Синглтоны в Ionic 3, Angular 4

Я знаю, что этот вопрос немного стар, но я не видел ответа, который дает простое решение проблемы, поэтому я решил, что поделюсь своим «простым» решением.

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 

Мы можем просто использовать обратный вызов .fail(), чтобы проверить, произошла ли ошибка.

Надеюсь, это поможет:)

24
задан Suraj Rao 13 April 2017 в 12:24
поделиться

2 ответа

Я использую ионный 3 с Lazyload угловой 4 и не имеет проблем. Чтобы сделать его одноразовым, убедитесь, что ваш модуль приложения предоставляет эту услугу. и удалите провайдеров @Component, которые используют сервис.

App Module

@NgModule({
  ...

  providers: [
    StatusBar,
    SplashScreen,
    { provide: ErrorHandler, useClass: IonicErrorHandler },
    Singleton // the service or provider to be single ton
  ]
})
export class AppModule { }

Служба

import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';

@Injectable()
export class Singleton {

  data = "init data";
  constructor() {
    console.log('Hello Singleton Provider');
  }

  set(data){
    this.data = data;
  }

  log(){
    console.log(this.data);   
  }
}

Tes Case служба на ионной странице

Первая страница

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Singleton } from '../../providers/singleton';

@IonicPage()
@Component({
  selector: 'page-first',
  templateUrl: 'first.html'
})
export class FirstPage {
  constructor(public navCtrl: NavController, public navParams: 
  NavParams,private single:Singleton) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad First');
    this.single.log(); // log init data;
    this.single.set("First singleton data");
  }

}

Вторая страница

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Singleton } from '../../providers/singleton';

@IonicPage()
@Component({
  selector: 'page-second',
  templateUrl: 'second.html'
})
export class SecondPage {
  constructor(public navCtrl: NavController, public navParams: 
  NavParams,private single:Singleton) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad Second');
    this.single.log(); // log First singleton data
  }

}

Третья страница создать новый экземпляр, если провайдеры добавлены в компонент

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Singleton } from '../../providers/singleton';

@IonicPage()
@Component({
  selector: 'page-second',
  templateUrl: 'second.html',
  providers:[Singleton] // wrong because its create a new instance
})
export class ThirdPage {
  constructor(public navCtrl: NavController, public navParams: 
  NavParams,private single:Singleton) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad ThirdPage');
    this.single.log(); // log init data
  }

}

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

24
ответ дан Ade Novan 13 April 2017 в 12:24
поделиться

Попробуйте сохранить экземпляр службы в вашем AppModule и получить экземпляр (вместо того, чтобы создать его экземпляр) позже в других компонентах.

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

export class AppModule {
    // Allows for retrieving singletons using 'AppModule.injector.get(MyService)' later in the code

    static injector: Injector;

    constructor(injector: Injector) {
        AppModule.injector = injector;
    }
}

И для извлечения экземпляра Службы используйте:

const myService = AppModule.injector.get(MyService);

Проверьте документацию Здесь !

1
ответ дан SrAxi 13 April 2017 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: