kątową: 2.0.0-beta.9Angular2: wstrzykiwać non klasę @Injectable
Czy to możliwe, aby wstrzyknąć non @Injectable
klasę w component
? Na przykład ta klasa może pochodzić z biblioteki firmy zewnętrznej.
kątową: 2.0.0-beta.9Angular2: wstrzykiwać non klasę @Injectable
Czy to możliwe, aby wstrzyknąć non @Injectable
klasę w component
? Na przykład ta klasa może pochodzić z biblioteki firmy zewnętrznej.
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:
myślę tak jest to możliwe. Przetestowałem to bez dekoratora @Injectable
i działa dobrze.
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
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]);
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
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
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 –