2017-02-21 9 views
0

私はOpaqueTokenを提供/注入する次のコードを持っていますが、使用しようとするとエラーが発生します。 VM4745:24 Error: (SystemJS) Can't resolve all parameters for HomePage: (NavController, ?).ionic2どのように/ @ Ina OpaqueTokenを提供しますか?

app.module.ts

import { NgModule, ErrorHandler, OpaqueToken } from '@angular/core'; 
    // ... 

    export const DEBUG = new OpaqueToken("debug"); 
    export function provideDebug(window: Window){ 
     if (~window.location.search.toLocaleLowerCase().indexOf("debug=true")){ 
      return true; 
     } 
     return false; 
    } 

    @NgModule({ 
    // ... 
    providers: [ 
     { provide: 'Window', useValue: window } 
     , { provide: DEBUG, useFactory: provideDebug, deps: [Window] } 
    ] 
    }) 

home.ts

import { Component, Inject } from '@angular/core'; 
    import { DEBUG } from './app.module'; 
    // ... 

    @Component({ 
     selector: 'page-home', 
     templateUrl: 'home.html' 
    }) 
    export class HomePage { 
     constructor(
      @Inject(DEBUG) isDebug: boolean, 
      @Inject(Window) window: Window 
     ) { 
      console.log("DEBUG=", isDebug); 
     } 
    } 

ここplunkrです:http://plnkr.co/edit/6N1FKQpS8vbKnwPKJQW1?debug=true&p=preview

ソリューション はここです(別のファイルからの)OpaqueTokenを注入するためのソリューションと、以下の答えに基づいてwindowオブジェクトも注入します。

Plunker

注:plunkerが正しく実行時にクエリ文字列を送信しませんが、実際には、これは問題になりません。

答えて

2

あなたは循環依存関係にあります。例debug.ts 2番目のエラーのために区切りファイルへ

移動DEBUGprovideDebugはここにある:

deps: [Window] 

は、ご使用の構成にはWindowプロバイダはありません。代わりに deps: ['Window']を使用して、文字列

providers: [ 
    { provide: 'Window', useValue: window }, 
    { provide: DEBUG, useFactory: provideDebug, deps: ['Window'] } 
] 

Updated Plunker

+0

としてプロバイダに定義されている 'debug.ts'が問題を解決するが、これは循環依存である理由私は不明です。説明できますか?また、私は 'window'に' window :: location'へのアクセスを与えるような '{provide: 'Window'、useValue:window}'行を '' Window''に挿入しようとしていましたが、更新されたPlunkerで動作するようですが、href = 'http:// run.plnkr.co/vAabzuRXur4BTnVL /' – michael

+0

'app.module.ts => homepage.ts => app.module.ts'です。 homepage.tsに 'console.log(DEBUG);'を入れてみると、 'undefined'であることがわかります – yurzui

+0

が見つかりました。次へ:JSウィンドウオブジェクトを挿入するにはどうすればいいですか?私はそれがレシピだと思った... – michael

関連する問題