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)
确保删除组件上的提供程序以使其成为单例.
尝试将服务的实例存储在您的组件中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)
在这里查看文档!