0

Angular 2로 마이 그 레이션하고 있는데 과도기 의존성 (주입 된 구성 요소간에 상태를 공유하지 않는 종속성)을 생성하기 위해 팩토리 패턴을 사용하려는 경우 서비스를 등록하는 가장 좋은 방법은 무엇입니까? 서비스를 등록하는 ng2의 방법으로 마이그레이션하려는 계획을 가진 1.5.8의 앵커각도 1.5.8에서 각도 2로 마이그레이션하는 경우 어떻게 팩토리 패턴을 사용합니까?

2 번에서 알 수 있듯이 구성 요소는 공급자 배열로 전달하여 서비스를 다시 인스턴스화 할 수 있지만이 옵션은 앵귤러 1에 존재하지 않으며 .factory은 2 호에서 더 이상 사용되지 않습니다. 문서는 많은 사랑을주지 않기 때문에

대시 보드에서 사용자가보고있는 탭의 상태를 관리하는 TabulationService가 있습니다. y 구성 요소간에 상태를 공유하지 마십시오. 나는 주입 된 각 구성 요소에서 서비스를 다시 인스턴스화하려고합니다. 그러나 Angular 2 모범 사례가 사용을 꺼리는 것 같으면 .factory을 사용하지 않는 것이 좋습니다.

여기는 "해킹"입니다.하지만 내 서비스에 대한 유형 힌트 및 상태 비 저장을 가져 오지만 생성 된 개체에 종속성 주입을 사용할 수 없기 때문에 마음에 들지 않습니다. 이 주입됩니다 때 나는 내 서비스의 상태를 관리 할 필요가 주입 도착하는 성분 (수동 서비스의 상태를 해제하여) 파괴 될 때 :

tab-manager.service.ts :

import { TabManager } from './tab-manager.class'; 
 

 
export class TabService { 
 
    manager; 
 

 
    public initialize(tabs: string[], defaultTab: string) { 
 
    this.manager = new TabManager(tabs, defaultTab); 
 
    } 
 
}

tab-manager.class.ts :

import { includes } from 'lodash'; 
 

 
const mandatory = (param) => { throw new Error(`${ param } is a required field in Tab Manager!`) }; 
 
export class TabManager { 
 
    tab: string; 
 

 
    constructor(public tabs: string[] = mandatory(`tabs`), public defaultTab: string = mandatory('defaultTab')) { 
 
    this.checkTab(defaultTab); 
 
    this.tab = defaultTab; 
 
    } 
 

 
    public switchTab(tab) { 
 
    const self = this; 
 

 
    self.checkTab(tab); 
 
    self.tab = tab; 
 
    } 
 

 
    private checkTab(tab: string) { 
 
    const self = this; 
 
    if (!includes(self.tabs, tab)) { 
 
     throw new Error(`{ tab } is not a valid tab. Available tabs are ${ self.tabs.join(',') }`); 
 
    } 
 
    } 
 
}

답변

0

비난 어디에도 없습니다 다음`angular.service tab-manager.service.ts에서 TabManager 서비스 가져 오기 및 호출에 의해 초기화됩니다 서비스 ('TabService'를 TabManagerService) Angular 2 documentation on. 각도 1 factory 서비스는 각도 2 DI에서 useFactory provider으로 구현됩니다.

여기서는 factory 또는 service인지는 중요하지 않습니다. 모두 같은 목적을 제공하고 같은 동작을 공유 - 마찬가지로, useFactoryuseClass 제공 업체 각도 2.

에서 같은 인젝터 내에서 싱글이 모두 프레임 워크에 균일하게 원하는 동작을 달성하기 위해 자들은이 각도 1에서 싱글 톤 의존해야 주입 후에 인스턴스화된다. 이것은 공장 또는 생성자 함수를 수행하면 정말 중요하지 않습니다 - 그들이 그것을 할 것이다 각도의 경우 1 각도 2

에서 각도 1 useValue 공급자 value 서비스로 정의해야합니다

export class TabulationService { ... } 
export type TTabulationService = typeof TabulationService; 
... 

app.value('TabulationService', TabulationService); 

app.component('some', { 
    controller: class { 
    tabulationService: TabulationService; 

    static $inject = ['TabulationService']; 

    constructor (TabulationService: TTabulationService) { 
     this.tabulationService = new TabulationService(); 
    } 
    } 
}); 

그리고 각도 2에 대한 :

providers: [{ provide: TabulationService, useValue: TabulationService }] 
... 

@Component(...) 
export class SomeComponent { 
    tabulationService: TabulationService; 

    constructor (@Inject(TabulationService) TabulationService: TTabulationService) { 
    this.tabulationService = new TabulationService(); 
    } 
} 
+0

고마워요.하지만 그게 제가 논의하고 있던 문제를 해결하는 것은 아닙니다. Angular 1 'value'공급자는 종속성 삽입을 사용할 수 없습니다. '의 사용.value '는 적어도 .service()를 사용하여 DI를 얻었 기 때문에'.service()'를 사용하는 것과 다르지 않고 실제로 이점이 적습니다. 문제는 제 2 클래스를 가져 와야하고 각도'.service()'내에서 의사 생성자 함수로부터 새로운 것을 호출해야합니다. 이것은 두 번째로 가져온 클래스가 DI에 액세스 할 수 없기 때문에 문제가됩니다. 각도 2 설명서를 "비난"하려고 시도하지 않았습니다. ng2는 서비스를 공장 식으로 만드는 방법에 대해 분명합니다. – roonie