0

Если я перехожу на 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)

ответ

0

Там нет ничего, чтобы обвинить Угловая 2 документация. Угловой 1 factory сервис выполнен в Угловом 2 DI как useFactory provider.

Это не имеет значения здесь, если это factory или service в этом случае. Оба служат те же цели, и одни и то же поведение - они одиночки в угловых 1. Аналогичны, useFactory и useClass провайдеров одноэлементны в пределах одного инжектора углового 2.

Для достижения желаемого поведения равномерно в обеих инфраструктурах зависимость должна после интродукции. Это действительно не имеет значения, если это делается с заводской или конструктором функцией - они должны быть определены как value службы в угловом 1 или useValue поставщике в угловой 2.

угловых 1 это будет:

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

Спасибо @estus, но это действительно не решает проблему, которую я обсуждал. Угловые 1 провайдеры 'value' не могут использовать инъекцию зависимостей. Использование '.значение 'ничем не отличается и на самом деле менее выгодно, чем использование' .service() ', потому что я, по крайней мере, получаю DI с помощью' .service() '. Проблема в том, что мне нужно импортировать 2-й класс и называть его новым из функции псевдоконструктора из углового '.service()', что является проблематичным, потому что 2-й импортированный класс не имеет доступа к DI. Я также не пытался «обвинять» угловую документацию. ng2 ясно о том, как сделать услуги заводскими. – roonie