2016-04-06 17 views
10

Mój konstruktor ma opcjonalne parametry i wydaje się, że bałagan z dominującym sposobem wykonywania DI.Konstruktor Angular 2 DI z opcjonalnymi parametrami

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

Typescript zrozumiałych względów nie podoba, że ​​mogę umieścić non opcjonalny parametr za opcjonalnym drugim, ponadto usługa nie zostanie wstrzyknięty gdy opcjonalny parametr nie jest ustawiony. Jak mam to rozwiązać? Nie mogę umieścić go gdzie indziej w konstruktorze, ponieważ byłbym oczekiwał ręcznego ustawienia usługi.

Czy jest coś w rodzaju wstrzyknięcia polowego?

@Inject() private _service:Service; 

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

Czy należy zastąpić opcjonalne parametry wartościami domyślnymi? Jakieś inne sugestie?

dzięki

Edytuj Jak omówiono poniżej, starałem się wprowadzić usługę do obiektu, który nie został stworzony przez kątowej za DI. To nie działa. Ponieważ nie mogę utworzyć tej klasy (modelu) za pomocą DI, teraz przekazuję usługę ręcznie z klasy, która tworzy instancje tych obiektów.

Odpowiedz

12

Po prostu dodaj dekorator @Optional() przed parametrem konstruktora, który powinien zostać wprowadzony tylko wtedy, gdy zarejestrowany jest dostawca.

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

I może być czegoś brakuje, ale " wiek "nie jest rzeczą, którą chcę wstrzyknąć. Tworzę nowy obiekt za pomocą konstruktora takiego jak 'new Person (" Mike ", 32);' i 'Service' powinien zostać wstrzyknięty niezależnie od ustawiania wieku, czy nie. Czy po prostu muszę opisać każdy opcjonalny (TS =?) Za pomocą @Opcja()? – KenavR

+2

Nie jestem pewien, czy w pełni rozumiem Twoje pytanie. W przypadku 'nowej osoby (" Mike ", 32)' nie ma w ogóle żadnego iniekcji zależności. DI jest włączony tylko wtedy, gdy instancje są tworzone przez samą DI. Na przykład komponenty i zależności są tworzone przez DI. Czy możesz wyjaśnić? –

+0

"DI jest zaangażowany tylko wtedy, gdy instancje są tworzone przez samą DI." Sądzę, że to mój "problem" lub coś, czego nie rozumiem. Tworzę obiekty ręcznie ustawiając nazwę i wiek przy użyciu konstruktora. Myślałem, że DI wprowadzi inne parametry z zarejestrowanym dostawcą. Zgadnij, że to nie działa. – KenavR

1

Jeśli dobrze rozumiem, co próbujesz zrobić, potrzebujesz fabryki usług. Zobacz tutaj: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

Zasadniczo

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

A potem

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

Następnie należy podać swoje usługi tak:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}] 
Powiązane problemy