2017-03-26 1 views
3

Ich habe eine Komponentenklasse als EventSchedulePage .Es erstreckt HandleStorageServiceabstract Klasse als below.You siehe gezeigt, dass es ein Verfahren showInvalidTokenAlert() auf dieser subclass.I benannt ist haben diese Methode jede einzelne Komponente nennen (Diese Methode gibt dem Benutzer eine tokenbasierte Fehlermeldung. Können Sie mir sagen, wie ich meine Klassen implementieren oder umbauen kann, um dieser Situation gerecht zu werden? Denn ich mag es nicht, showInvalidTokenAlert() auf jede Komponente zu setzen. Ich möchte die Implementierung dieser Methode an einem einzigen Ort behalten.Typoskript und mehrere Klassen

Subclass

export class EventSchedulePage extends HandleStorageService { 

    constructor() { 
     super(); 
     } 

    showInvalidTokenAlert() { 
     //show alert 
     } 
    } 

abstrakte Klasse

export abstract class HandleStorageService { 
    result: string = ''; 

    constructor() { 
    } 
} 
+1

Warum setzen Sie 'showInvalidTokenAlert' nicht in' HandleStorageService'? –

+0

Dieser Service ist nur für den Umgang mit Storage-bezogenen Dingen. Das ist der Grund dafür. @ NitzanTomer – Sampath

+0

ist es ionischen 2 insbesondere? wenn ja, könnten Sie nur einen Anbieter mit dieser Funktion injizieren .. –

Antwort

4

Sie könnten eine BasePage erstellen und alle gemeinsamen Code setzen dort.

import { Component, Injector } from '@angular/core'; 
import { AlertController, ...} from 'ionic-angular'; 

@Component({ selector: '', template: '<span></span>' }) 
export class BasePage { 

    private _alertCtrl: AlertController; 
    private _toastCtrl: ToastController; 

    constructor(public injector: Injector) { } 

    // Get methods used to obtain instances from the injector just once 
    // ---------------------------------------------------------------- 

    // AlertController 
    public get alertCtrl(): AlertController { 
     if (!this._alertCtrl) { 
      this._alertCtrl = this.injector.get(AlertController); 
     } 
     return this._alertCtrl; 
    } 

    // ToastController 
    public get toastCtrl(): ToastController { 
     if (!this._toastCtrl) { 
      this._toastCtrl = this.injector.get(ToastController); 
     } 
     return this._toastCtrl; 
    } 

    // ... 

    // Helper methods 
    // ---------------------------------------------------------------- 

    public showAlertMessage(message: string): void { 
     let alert = this.alertCtrl.create({ ... }); 
     alert.present(); 
    } 

    public showToastMessage(message: string): void { 
     let toast = this.toastCtrl.create({ ... }); 
     toast.onDidDismiss(() => { 
      console.log('Dismissed toast'); 
     }); 
     toast.present(); 
    } 

} 

Der Schlüssel ist, dass die BasePage eine Instanz des Injektors aus der Unterklasse empfängt, so könnten Sie eine Instanz erhalten, die Sie von ihm brauchen (wie die AlertController Instanz, die Sie eine Warnmeldung zeigen müssen). Bei Verwendung der Get-Methoden wird jede Instanz nur einmal vom Injektor abgerufen.

Und dann in allen Seiten Ihrer App:

import { Component, Injector } from '@angular/core'; 
import { BasePage } from '../path/to/base'; 

@Component({ 
    selector: 'page-home', 
    templateUrl: 'home.html' 
}) 
export class HomePage extends BasePage { 

    constructor(public injector: Injector) { 
     super(injector); 
    } 

    public someMethod(): void { 
     // You can use the methods from the BasePage! 
     this.showAlertMessage('Your message...'); 
    } 

    public someOtherMethod(): void { 
     this.showToastMessage('Another message'); 
    } 

} 

Auf diese Weise ist super einfach einige weitere Hilfsmethoden hinzuzufügen.

+0

mein Problem hier ist, ich bin schon Verwenden von 'abstract' Basisklasse no (dh' HandleStorageService')? das ist für die Handhabung von Storage-bezogenen Methoden.So wie kann ich 2 Klassen auf TS erweitern? – Sampath

+0

Was ist mit dem Verschieben der Logik von 'HandleStorageService' auf die' BasePage'? Immerhin könnte es auch als Helfer angesehen werden ... – sebaferreras

+0

Kannst du mir bitte sagen, wo ich diese Methode anlegen soll? Public get togetCtrl(): ToastController {'? Und ein bisschen mehr Informationen über 'Injektor'? – Sampath

1

Sie können mit der Funktion showInvalidTokenAlert()

@Injectable() 
export class AlertProvider{ 
    constructor(){} 

    showInvalidTokenAlert(){ 
    //... 
    } 
} 

Set es in App eine separate Provider-Klasse erstellen. module.ts als Provider für den Fall, dass Sie als Singleton benötigen

In jede Komponente injizieren, die Sie benötigen.

export class EventSchedulePage extends HandleStorageService { 

    constructor(private alertProvider:AlertProvider) { 
     super(); 
     } 
    //call this.alertProvider.showInvalidTokenAlert() 
} 
+0

kann ich 'öffentliche navCtrl: NavController' nicht innerhalb des' AlertProvider' so verwenden? 'Konstruktor (öffentliche alertCtrl: AlertController, öffentliche navCtrl: NavController) {}'. Es gibt diesen Fehler 'Fehler: Uncaught (in Versprechen): Fehler: Fehler in ./MyApp Klasse MyApp - Inline-Vorlage: 0: 0 verursacht durch: Nein Anbieter für NavController! Fehler: DI-Fehler. Wissen Sie warum? – Sampath

+0

https://github.com/driftyco/ionic/issues/9581 scheint wie es von Design ist ... –

+0

versuchen Sie '@Inject (NavController) navController: NavController' im Konstruktor –

1

hmm.. It seems anti-pattern no? I mean using service layer to handle UI related things? That is why I tried to get the solution based on TS.What is your thoughts about this? – Sampath

Es ist auf jeden Fall mehr MVCS-like (Model-View-Controller-Service), dass in der Steuerung zu handhaben. Aber das ist ein widely taken approach.

Wenn Sie wollen, ist @suraj's answer meine persönliche Empfehlung.

Handhabung Warnungen auf dem Controller ist sicherlich möglich. Weiter lesen.

ereignis Zeitplan-page.service.ts

export class EventSchedulePage extends HandleStorageService { 
    // ... 
    foo() { 
    if (!bar) { 
     throw new Error('Something went wrong.'); 
    } 
    // ... 
    } 
} 

home.controller.ts

export class HomeController { 
    // ... 
    foo() { 
    try { 
     eventSchedulePageService.foo(); 
    } catch (error) { 
     window.alert(error); // Handle and UI display the error on the controller. 
    } 
    } 
} 

Um zu folgen, können Sie custom error classes oder separate Funktionen verwenden, um Ihre Fehler auswerfen/handhaben.