2016-12-21 3 views
1

Ich möchte wissen, wie injected Dienste auf IONIC 2 funktioniert. Insbesondere möchte ich wissen, wie viele Instanzen vorhanden sein werden, wenn ein Dienst in zwei oder mehr Controllern verwendet wird.Instanztyp für inyected Dienste in IONIC 2

In der Vergangenheit fragte ich nach einem Kollegen, und er sagte mir, dass IONIC 2 mit Singleton-Muster arbeitet, aber in meinem Test denke ich, dass es nicht.

Ich habe zwei Controller, A und B; und ein Dienst SVC1. Ist so etwas.

Steuerung A

import { NavController, Platform } from 'ionic-angular'; 
import { PageB } from '../pageb/pageB'; 
import { SVC1 } from '../../providers/svc1'; 

@Component({ 
    selector: 'page-a', 
    templateUrl: 'a.html', 
    providers: [SVC1] 
}) 

export class PageA { 
    constructor(public navCtrl: NavController, platform: Platform, public svc: SVC1) { 
    } 

onAddEventClicked(event): void {  
    this.navCtrl.push(PageB); 
    } 
} 

Steuerung B

import { NavController, Platform } from 'ionic-angular'; 
import { SVC1 } from '../../providers/svc1'; 

@Component({ 
    selector: 'page-b', 
    templateUrl: 'b.html', 
    providers: [SVC1] 
}) 

export class PageB { 
    constructor(public navCtrl: NavController, platform: Platform, public svc: SVC1) { 
    } 
} 

Dienst

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
@Injectable() 
export class SVC1 { 
    constructor(public http: Http) { 
    console.log('creating another instance'); 
    } 
} 

Das ist sehr, sehr einfach. PageA hat eine Schaltfläche. Wenn Sie darauf klicken, geht es zu PageB. PageA und PageB verwenden denselben Dienst.

Wenn dieser Dienst Singleton war, wird die Meldung "Eine andere Instanz erstellen" nur einmal angezeigt. Aber es erscheint zweimal.

Warum passiert das? IONIC verwendet Singleton-Muster, um Service-Referenz zu ändern? Gibt es eine Möglichkeit, nur eine Instanz meines Dienstes zu haben?

Vielen Dank

PS: Sorry für mein schlechtes Englisch, hoffentlich werde ich mit mehr Zeit verbessern.

Antwort

1

Sie haben Ihren Dienst als Anbieter für jede einzelne Seite festgelegt. Dies ist nicht das Singleton-Muster. Dies wird verwendet, wenn Sie den Service nur für diese Komponente benötigen.

Für Singleton-Muster legen Sie es als Anbieter in NgModule in app.module.ts fest.

@NgModule({ 
declarations:[..] 
imports:[..], 
bootstrap:[IonicApp], 
entryComponents:[...], 
providers:[SVC1] //here 
}) 
export class AppModule { } 

und dann fügen Sie den Dienst im Konstruktor von Komponenten, die Sie benötigen. here Angular Offizielle Dokumentation enthält Informationen zur Abhängigkeitsinjektion