Подтвердить что ты не робот

Angular 2 Конструктор DI с дополнительными параметрами

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

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

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

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

@Inject() private _service:Service;

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

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

спасибо

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если я правильно понимаю, что вы пытаетесь сделать, вам нужна услуга factory. См. Здесь: 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]}]