2016-06-23 6 views
1

Hier ist mein Anwendungsfall erstellen und Draht:Wie man manuell einen Dienst zur Laufzeit auf eine Komponente in Typoskript Angular 2

Ich habe eine Schnittstelle mit 4 verschiedenen Implementierungen WorkflowA, WorkflowB, WorkflowC und WorkflowD.

export interface IWorkflow { 
    getQuestions(); 
    validateQuestions(); 
    getWorkflowSteps(); 
} 

Ich habe eine WorkflowManager Klasse, die den entsprechenden Workflow auf einer Eingangsgröße

export class WorkflowManager { 

    workflow:IWorkflow; 

    getWorkflow(workflow){ 
    switch (workflow) { 
     case 'workflowA': 
     return new workflowA(); 
     case 'workflowB': 
     return new workflowB(); 
     case 'workflowC': 
     return new workflowC(); 
     case 'workflowD': 
     return new workflowD(); 
     default: 
     throw new Error(`Unrecognized workflow: ${workflow}`); 
    } 
    } 

} 

ich auch eine Komponente haben WorkflowComponent Basis zurückgibt, die

Beispiel geladen wird (Werksmuster?): /workflow=WorkflowA lädt WorkflowComponent. Die Komponente extrahiert dann das routeparam workflow und übergibt es dann basierend auf dem Wert an die WorkflowManager, die den entsprechenden Workflow zurückgibt.

Hier ist ein Ausschnitt aus meiner Komponente

@Component({ 
... 
}) 

export class Workflow implements OnInit { 

    workflowInstance: IWorkflow; 

    constructor(
    private route: ActivatedRoute, 
    private workflowManager: WorkflowManager, 
) { 

    } 

    ngOnInit() { 
    this.route.params.subscribe(params => { 
     let regType: string = params['workflow']; 
     this.workflowInstance = this.workflowManager.getWorkflow(workflow); 
    }); 
    } 

} 

Aber ich weiß nicht, wie die Idee der Workflow* Klassen manuell instanziieren. Wie kann ich dies verbessern, damit ich es mit der von Angular2 gelieferten API verdrahte, so dass es in andere Komponenten verwaltet/injiziert werden kann?

Auch in meiner aktuellen Implementierung werde ich Ajax-Aufrufe außerhalb von Angular Framework machen müssen, was meiner Meinung nach nicht das Beste ist.

Haben Sie Ideen, wie Sie das Angular-Framework nutzen und dieses verbessern können?

Antwort

1

Eine Möglichkeit ist, einen Injektor und erwerben die Workflow-Instanz zwingend zu injizieren mag:

@Injectable() 
export class WorkflowManager { 
    constructor(private injector:Injector) {}  

    workflow:IWorkflow; 

    getWorkflow(workflow){ 
    switch (workflow) { 
     case 'workflowA': 
     return this.injector.get(workflowA); 
     case 'workflowB': 
     return this.injector.get(workflowB); 
     case 'workflowC': 
     return this.injector.get(workflowC); 
     case 'workflowD': 
     return this.injector.get(workflowD); 
     default: 
     throw new Error(`Unrecognized workflow: ${workflow}`); 
    } 
    } 
} 

Alternativ können Sie injizieren workflowA, workflowB, workflowC, workflowA und zurück genau das Richtige auf der workflow abhängig, aber ich denke, Die Verwendung des Injektors ist für diesen Anwendungsfall besser geeignet.

Stellen Sie sicher, dass Sie workflowA, workflowB, workflowC angeben.

+0

Danke. Wie auch immer, um dies weiter zu verbessern, indem nicht alles instanziiert wird, sondern nur das, was jedes Mal benötigt wird? – user6123723

+0

Nicht sicher, was du meinst. Der obige Code instanziiert nur, was explizit durch den Parameter "workflow" angefordert wird. Wenn Sie eine Instanz über alle DI mit Konstruktorparametern einfügen würden, würde dies alle auf einmal instanziieren. –

+0

Im Gegenzug this.injector.get (workflowA), ist 'workflowA' (beachten Sie den kleinen Buchstaben 'w' am Anfang des Wortes) eine bereits in dieser Klasse deklarierte Instanz? Wie wählt Angular WorkflowA-Klasse aus 'workflowA' im Gegenzug this.injector.get (workflowA) aus? Vielen Dank. – user6123723

Verwandte Themen