私はDIとの問題を解決することに成功しました。私はいくつかのチュートリアルを読んで、ジストを取得しますが、カスタムサービスでいくつかのネストされたDIを作成した後、物事は崩壊し始めました。Angular2で依存関係注入を正しく使うには?
誰かがuseClassではなくuseFactoryをいつ使用するか説明できますか?私はng2のドキュメントを見て、私は例を見ましたが、私はそれらを私の問題にマップすることはできません。現在、私のブートストラップは、次のようになります。
bootstrap(
App,
[
FORM_PROVIDERS,
ROUTER_PROVIDERS,
HTTP_PROVIDERS,
provide(LocationStrategy, { useClass: PathLocationStrategy }),
provide(RequestOptions, { useClass: DefaultRequestOptions }),
provide(MsgService, { useClass: MsgService }),
provide(HttpAdvanced, { useFactory: (MsgService, HTTP_PROVIDERS) => new HttpAdvanced(MsgService, HTTP_PROVIDERS), deps: [MsgService, HTTP_PROVIDERS] }),
provide(AuthService, { useFactory: (HttpAdvanced) => new AuthService(HttpAdvanced), deps: [HttpAdvanced, HTTP_PROVIDERS, MsgService] }),
provide(FormBuilderAdvanced, { useFactory: (FormBuilder, HttpAdvanced) => new FormBuilderAdvanced(FormBuilder, HttpAdvanced), deps: [FormBuilder, HttpAdvanced] }),
provide(MsgServiceInternal, { useClass: MsgServiceInternal })
]
);
そして、私の最新号は、次のとおりです。
EXCEPTION: Error during instantiation of AuthService! (HeaderBar -> AuthService).
ORIGINAL EXCEPTION: TypeError: this.http.get is not a function
は私の依存関係が
HttpAdvanced -> Http(ng2), MsgService
MsgService -> MsgServiceInternal
AuthService -> HttpAdvanced
FormBuilderAdvanced -> FormBuilder(ng2), HttpAdvanced
1.のように動作し、私は適切に提供し使用しています/ useClass/useFactoryと他の依存関係を持つサービスを提供するには?私は
@CanActivate(AuthService.isEditorInjector())
に提供機能を持つようにしたいが、私はので、コンストラクタ・インジェクションを使用することはできませんので
static isUserInjector() {
return (next, prev) => Injector.resolveAndCreate([AuthService, provide(HttpAdvanced, { useClass: HttpAdvanced })]).get(AuthService).isUser();
}
@:
はまた、私は自分のコード内の1つの場所で持っていますCanActivateはクラススコープ外にあるため、コントローラ内にサービスを挿入してから参照することはできません。@CanActivate(this.authService.isEditor())
2.これにはどのような良い解決策がありますか?
SOME CODE:
@Component({
selector: 'ShowStats',
templateUrl: './dest/views/showStats/showStats.html',
directives: [ COMMON_DIRECTIVES, UsersCount, AdminsList, GlobalWishlist, PopularTrack ]
})
export class ShowStats {
authService : AuthService;
constructor(authService : AuthService){
this.authService = authService;
}
}
... next file ...
@Injectable()
export class HttpAdvanced {
msgService: MsgService;
http: Http;
constructor(msgService: MsgService, http: Http) {
this.msgService = msgService;
this.http = http;
}
/*
* This is for plain ol' GET requests .. with callback of course.
*/
public get(url, callback) {
return this.http.get(url).subscribe((res) => {
let data = res.json().data;
callback(data);
}, this.msgService.httpErrorHandler);
}
.... other code for HttpAdvanced
3. ファイルをインポートするためには、DIのために重要ですか?私は私がMsgServiceとMsgServiceInternalを同じファイルに持っていてMsgServiceが内部に依存していることに気付いたと思いますが、私は内部を入れなければなりませんでしたが、私は100%ではありませんimporting
の順序は同じですか?
4. だから私は単純に行う場合:
bootstrap(
App,
[
FORM_PROVIDERS,
ROUTER_PROVIDERS,
HTTP_PROVIDERS,
provide(LocationStrategy, { useClass: PathLocationStrategy }),
provide(RequestOptions, { useClass: DefaultRequestOptions }),
MsgService,
HttpAdvanced,
AuthService,
FormBuilderAdvanced,
MsgServiceInternal
]
);
私が取得:
Cannot resolve all parameters for 'FormBuilderAdvanced'(?, ?).
Make sure that all the parameters are decorated with Inject or have
valid type annotations and that 'FormBuilderAdvanced' is decorated
with Injectable.
私はuseFactory
と、このエラーを除去するために使用されるが、私は今、混乱しています。これは、彼らが何かを見ることができないためにデンプスが注射されないということですか?
Formクラス:あなたがのためにクラスを利用できるようにしたい場合は
export class FormBuilderAdvanced {
http: HttpAdvanced;
fb: FormBuilder;
constructor(fb: FormBuilder, http: HttpAdvanced) {
this.fb = fb;
this.http = http;
}
create(controlNames: string[], submissionUrl: string, getter?: any) {
return new Form(this.fb, this.http, controlNames, submissionUrl, getter);
}
}
はおそらく、あなたは' HeaderBar'依存性を逃したホープ? –
** ** **。 DIがコンストラクタパラメータを持つクラスを挿入したい場合は、 'Injectable'アノテーションを追加する必要があります:' @Injectable()export class FormBuilderAdvanced {'。あなたの場合、別の問題があります。 DIは 'controlNames:string []、submissionUrl:string、getter ?: any'を解決できません。 'string []'または 'any'のプロバイダはありません。ここでコンストラクタに何を渡したいのですか?おそらくこれは 'useValue'や' useFactory'の場合です。 –
ああ私はどこにでも置いている。この愚かだったと信じられない – ditoslav