如果我正在迁移到 Angular 2 并且我想使用工厂模式来创建一个瞬态依赖项(一种在注入它的组件之间不共享状态的依赖项),那么在 Angular 中注册服务的最佳方法是什么1.5.8 计划迁移到 ng2 的注册服务方式
我知道在 Angular 2 中,组件可以通过将服务传递给 providers 数组来重新实例化服务,但是该选项在 Angular 1 中不存在,而且似乎.factory
在 Angular 2 中几乎已被弃用,因为文档并没有给它太多的爱
一个示例是 TabulationService,它管理用户在仪表板上查看的选项卡的状态,这显然不会在组件之间共享状态。我想在它注入的每个组件中重新实例化服务。.factory
但如果 Angular 2 最佳实践似乎回避使用它,我也想避免使用它。
这是我使用的“hack”,但我不喜欢它,因为即使它让我为我的服务提供类型提示和无状态,我也不能在创建的对象中使用依赖注入,我必须管理我的服务在被注入时的状态以及当它被注入的组件被销毁时(通过手动清除服务的状态):
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(',') }`);
}
}
}
然后通过导入 TabManager 服务tab-manager.service.ts
并调用 `angular.service('TabService', TabManagerService)来初始化该服务