2016-06-23 2 views
1

각도 타이프의 구성 요소에 런타임 서비스를 만들고 와이어합니다. 어떻게 수동으로 여기 내 사용 사례의 2

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

내가 입력 변수에 따라 적절한 워크 플로우를 반환하는 WorkflowManager 클래스가

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

} 

나는 또한로드되는 구성 요소 WorkflowComponent

예 (공장 패턴을?) : /workflow=WorkflowA로드 WorkflowComponent. 그런 다음 구성 요소는 routeparam workflow을 추출하고 값을 기준으로 적절한 워크 플로를 반환하는 WorkflowManager으로 전달합니다.

은 여기 내 구성 요소

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

} 

의 조각입니다하지만 수동으로 Workflow* 클래스의 인스턴스의 아이디어를 좋아하지 않는다. 어떻게하면 Angular2가 제공하는 API를 사용하여 연결하여 다른 구성 요소에 관리/주입 할 수 있도록 개선 할 수 있습니까?

또한 현재 구현에서는 할 수있는 최선의 방법이라고 생각하지 않는 각도 프레임 워크 외부에서 ajax 호출을 만들어야합니다.

각도 프레임 워크를 활용하고이를 개선하는 방법에 대한 아이디어가 있으십니까?

답변

1

한 가지 방법은 주사기를 주입하고 워크 플로 인스턴스를 취득하는 것입니다은 명령 적으로 좋아 :

또는
@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}`); 
    } 
    } 
} 

당신이 workflowA, workflowB, workflowC, workflowA를 주입하고 바로 workflow에 따라 권리를 반환하지만 내가 생각할 수있는 인젝터를 사용하는 것이이 사용 사례에 더 적합합니다.

workflowA, workflowB, workflowC을 제공했는지 확인하십시오.

+0

감사합니다. 어쨌든 모든 것을 인스턴스화하지 않고 매번 필요한 것만을 추가하여이를 향상시킬 수 있습니까? – user6123723

+0

무슨 뜻인지 확실치 않습니다. 위의 코드는'workflow' 매개 변수에 의해 명시 적으로 요청 된 것을 인스턴스화합니다. 사용하는 모든 DI에 대해 생성자 매개 변수로 인스턴스를 삽입하면 모든 인스턴스를 한 번에 인스턴스화합니다. –

+0

반환 this.injector.get (workflowA), 'workflowA'(단어의 시작 부분에 작은 문자 'w'가 있음)이 클래스에서 이미 선언 된 인스턴스입니까? this.injector.get (workflowA) 문을 반환 할 때 'workflowA'의 각도 선택 WorkflowA 클래스가 어떻게 선택됩니까? 고맙습니다. – user6123723