Если я перехожу на Angular 2, и я хочу использовать шаблон фабрики для создания переходной зависимости (зависимость, которая не разделяет состояние между компонентами, в которые она вводится), что является лучшим способом регистрации службы в угловом 1.5.8 с планами перехода на способ регистрации регистрации ng2Как использовать шаблон фабрики, если я перехожу из Angular 1.5.8 в Angular 2?
Я знаю, что в угловом 2 компоненты могут восстанавливать службы, передавая их в массив поставщиков, но эта опция не существует в угловом 1, и это похоже, .factory
почти устарел в угловом 2, так как документы не очень любят
Примером может служить служба табуляции, которая управляет состоянием той вкладки, которую пользователь просматривает на приборной панели, что очевидно y не разделять состояние между компонентами. Я хотел бы восстановить сервис в каждом компоненте, в который он был введен. Но я также хочу, чтобы избежать использования .factory
, если лучшие методы Angular 2, похоже, уклоняются от использования.
Вот «взломать», к которому я прибегал, но мне это не нравится, потому что, хотя мне и присваивается тип намека и безгражданства для моего сервиса, я не могу использовать инъекцию зависимостей в объекте, который создается и я должен управлять состоянием моей службы, когда он получает инъекцию и, когда компонент, в котором он получает инъекцию уничтожается (вручную очищая состояние сервиса):
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)
Спасибо @estus, но это действительно не решает проблему, которую я обсуждал. Угловые 1 провайдеры 'value' не могут использовать инъекцию зависимостей. Использование '.значение 'ничем не отличается и на самом деле менее выгодно, чем использование' .service() ', потому что я, по крайней мере, получаю DI с помощью' .service() '. Проблема в том, что мне нужно импортировать 2-й класс и называть его новым из функции псевдоконструктора из углового '.service()', что является проблематичным, потому что 2-й импортированный класс не имеет доступа к DI. Я также не пытался «обвинять» угловую документацию. ng2 ясно о том, как сделать услуги заводскими. – roonie