Ionic 3中的单身人士,Angular 4

Dra*_*vic 24 ionic2 ionic3 angular

我将服务定义为类,如下所示:

@Injectable()
export class MyService {
 ...
}
Run Code Online (Sandbox Code Playgroud)

在其他组件或页面中,我只使用import命令导入该类.

import { MyService } from '../pages/services/myservice';
Run Code Online (Sandbox Code Playgroud)

在构造函数中:

constructor(public _MyService: MyService)
Run Code Online (Sandbox Code Playgroud)

在我的主app.module.ts中,我已将该类服务添加为提供者.

providers: [someOtherThings, MyService, someOtherThings]
Run Code Online (Sandbox Code Playgroud)

在Ionic 2中,事情按预期工作.服务是单身人士.

但是在使用角度4的Ionic 3中,看起来每个组件都在创建该类的新实例.

是否有一些在角度4中创建单例服务类的新方法?

小智 26

我使用离子3与懒惰加角4并没有问题.要使其成为单身,请确保您的应用模块提供服务.并删除使用该服务的@Component上的提供程序.

应用模块

@NgModule({
  ...

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

服务

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);   
  }
}
Run Code Online (Sandbox Code Playgroud)

Tes在离子页面上提供服务

第一页

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");
  }

}
Run Code Online (Sandbox Code Playgroud)

第二页

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
  }

}
Run Code Online (Sandbox Code Playgroud)

第三页是创建新实例,如果供应商在添加成分

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
  }

}
Run Code Online (Sandbox Code Playgroud)

确保删除组件上的提供程序以使其成为单例.


SrA*_*Axi 2

尝试将服务的实例存储在您的组件中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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并检索服务的实例使用:

const myService = AppModule.injector.get(MyService);
Run Code Online (Sandbox Code Playgroud)

在这里查看文档!