2016-03-17 12 views

Odpowiedz

7

Tak, jest to możliwe. W rzeczywistości dekorator @Injectable nie określa, że ​​dana klasa może być wstrzykiwana do innych, ale że chcemy wprowadzić coś do niej na poziomie jej konstruktora.

Jeśli nie chcesz wstrzykiwać czegoś do swojej klasy, dodawanie dekoratora @Injectable nie jest obowiązkowe. Tę klasę można wstrzykiwać w inne.

Myślę, że ten problem mógłby Github pomóc:

Co jest tu ważne jest, aby zrozumieć różnicę między dekoratorów i adnotacji. Oto wielki artykuł na ten temat:

2

myślę tak jest to możliwe. Przetestowałem to bez dekoratora @Injectable i działa dobrze.

plunker

AuthService.ts

import {Injectable} from 'angular2/core'; 
import {Http, Response,HTTP_PROVIDERS} from 'angular2/http'; 
import 'rxjs/Rx'; 
import {Observable} from 'rxjs/Observable'; 

export interface sharedObject{ 
    firstName:string; 
    lastName:stirng; 
} 


export class AuthService{ 
    user:sharedObject; 
    constructor() 
    { 
    console.log('AuthService started') 
    this.user={firstName:"micronyks",lastName:"shah"}; 
    } 

    change() { 
    console.log('change to angular2'); 
    this.user.firstName="micronyks1"; 
    this.user.lastName="shah1"; 
    }  
} 

Jeśli zastanawiasz się, ponieważ niektóre klasy, korzystanie DI w konstruktorze i nie używać @Injectable(). Ponieważ ten dekorowany @, na przykład @Components.

The HeroesComponent również ma wstrzykniętą zależność. Dlaczego nie dodamy @Injectable() do HeroesComponent?

Możemy dodać, jeśli naprawdę chcemy. Nie jest to konieczne, ponieważ HeroesComponent jest już ozdobiony @Component. TypeScript generuje metadane dla dowolnej klasy z dekoratorem, a każdy dekorator zrobi to.

Aby uzyskać więcej informacji można przeczytać link Angular page

+0

Dzięki za sugestię. Ale teraz, jeśli ktoś podoba mi się moja odpowiedź, zobaczy również twój komentarz i pójdzie w dobrym kierunku :-) – micronyks

+0

Och, wielki człowieku! Dlaczego nie edytujesz mojej odpowiedzi i linku do angular.io. Przyjmuję twoją edycję :-). Jestem w jakiejś pracy, więc nie mogę tego zrobić zgodnie z oczekiwaniami. :-) – micronyks

+0

nie ma problemu, ale na pewno możesz zrobić to lepiej ode mnie, ponieważ mój angielski jest bardzo zły, możesz przeglądać i edytować, jeśli nie lubisz szczęścia –

1

Jeśli klasa ma zależności, nadal można używać go w DI.Wystarczy podać fabrykę bo

Jeśli chcesz, aby móc wprowadzić klasę, która sama ma zależności (argumenty konstruktora), ale nie chcą lub nie mogą stosować @Injectable(), a następnie można użyć zamiast fabryki

bootstrap(AppComponent, [ 
    SomeDep, 
    provide(SomeType, {useFactory: (dep) => new SomeType(dep), 
     deps: [SomeDep]}) 
]); 

można tworzyć zmienne dla takich dostawców, aby uczynić je łatwo wielokrotnego użytku bez tego uciążliwego deklaracji (jak na przykład HTTP_PROVIDERS)

export const SOME_TYPE_PROVIDERS: any[] = [ 
    SomeDep, 
    provide(SomeType, {useFactory: (dep) => new SomeType(dep), 
     deps: [SomeDep]}) 
]; 

a następnie używać go jak

bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]); 
Powiązane problemy