2016-04-06 8 views
10

Мой конструктор имеет необязательные параметры, и они, кажется, вовлекаются в преобладающий способ делать DI.Угловой 2 конструктор DI с необязательными параметрами

constructor(public name:string, public age?:number, private _service:Service); 

Машинопись по понятным причинам не нравится, что я поставил неофициальный необязательный параметр за опциональным, кроме того, служба не получает инъекции, когда дополнительный параметр не установлен. Как я могу это решить? Я не могу помещать его где-то еще в конструкторе, так как я ожидал бы установить сервис вручную.

Есть ли что-то вроде инъекции в поле?

@Inject() private _service:Service; 

constructor(public name:string, public age?:number); 

Должен ли я заменить необязательные параметры на значения по умолчанию? Любые другие предложения?

благодаря

Редактировать Как описано ниже, я попытался придать услугу в объект, который не создается с помощью DI угловых в. Это не работает. Поскольку я не могу создать этот класс (модель) с помощью DI, я теперь передаю службу вручную из класса, который создает экземпляры этих объектов.

ответ

12

Просто добавьте декоратор @Optional() перед параметром конструктора, который следует вводить только в том случае, если зарегистрирован провайдер.

constructor(public name:string, @Optional() public age:number) 
+0

Я может быть что-то отсутствует, но " возраст "- это не то, что я хочу ввести. Я создаю новый объект, используя конструктор типа 'New Person (« Майк », 32);' 'и' Service' должен вводиться независимо от установки возраста или нет. Или мне просто нужно аннотировать все необязательные (TS =?) С помощью @Optional()? – KenavR

+2

Не уверен, что я полностью понимаю ваш вопрос. С 'New Person (« Майк », 32)« никакой инъекции зависимостей вообще нет. DI участвует только в том случае, когда экземпляры создаются самим DI. Например, компоненты и его зависимости создаются с помощью DI. Не могли бы вы прояснить? –

+0

«DI участвует только в том случае, когда экземпляры создаются самим DI». Наверное, это моя «проблема» или вещь, которую я не понял. Я создаю объекты вручную, определяя имя и возраст, используя конструктор. Я думал, что DI будет вводить другие параметры зарегистрированным провайдером. Угадайте, что это не сработает. – KenavR

1

Если я правильно понимаю, что вы пытаетесь сделать, вам нужна фабрика услуг. Смотрите здесь: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

В принципе,

class MyClass { 
    constructor(public name:string, private _service:Service, public age?:number){} 
} 

А потом

let myFactory = (_service: Service) => { 
    return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service); 
}; 

И тогда вы должны предоставить свой сервис, как это:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}] 
Смежные вопросы