ionic2你如何提供/ @注入一个OpaqueToken?

时间:2017-02-21 18:30:27

标签: angular ionic2

我有以下代码提供/注入OpaqueToken,但我在尝试使用它时遇到错误。 VM4745:24 Error: (SystemJS) Can't resolve all parameters for HomePage: (NavController, ?).

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);
        }
    }

这是一个傻瓜:http://plnkr.co/edit/6N1FKQpS8vbKnwPKJQW1?debug=true&p=preview

溶液 这里是注入OpaqueToken(来自不同文件)的解决方案,并根据以下答案注入window对象。

Plunker

注意:plunker没有正确地将查询字符串发送到运行时,但实际上这不是问题。

1 个答案:

答案 0 :(得分:2)

你有一个循环依赖。

DEBUGprovideDebug移至分隔的文件,例如debug.ts 第二个错误在这里:

deps: [Window]

您的配置中没有Window提供程序。使用 deps: ['Window']而是将您的提供商定义为字符串

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

<强> Updated Plunker