0

ルート/コンポーネントがインスタンス化される前にデータをフェッチしたい。したがって、Angular2-Routing-Module の "Resolver" インターフェイスを使用したいと考えています。

私のコードを見てください。プロバイダー名として文字列を使用していますが、プロバイダーに OpaqueToken を使用するとエラーがスローされます。

「NOT WORKING」コメントに注意してください。

1 My (Child-)Routes (抜粋)。

export const routes: Routes = [{
path: 'myPath',
component: MyComponent,
children: [
    {
        path: ':id',
        component: MyComponent,
        resolve: {
            itemData: 'MyResolver' // WORKING --- wanted to replace with itemData: MyToken
        }
    }
]
}];

2 私のモジュールのコード (抜粋):

export let MyToken: OpaqueToken = new OpaqueToken('my.resolver');    

@NgModule({
        imports: [
            CommonModule,
            ...
        ],
        declarations: [
            MyComponent,
        ],
        providers: [
            {
                provide: 'MyResolver', // WORKING -- wanted to replace with provide: MyToken
                useFactory: (DataService: any) => {
                    return new MyResolverService(DataService);
                },
                deps: [MyInstanceOfDataService]
            }
        ]
    })
    export class MyModule {
    }

3 私のカスタム Resolver-Class (抜粋):

@Injectable()
export class MyResolverService implements Resolve<any> {

    constructor(protected DataService: any) {
    }

    resolve(ActivatedRoute: ActivatedRouteSnapshot): Promise<any> {
        return this.DataService.getItem(id).toPromise()
                .then((response: any}) => {
                    return response;
                });
    }
}

文字列 ("myResolver") を作成された OpaqueToken ("MyToken" - もちろん引用符なし) に置き換えることはできません。理由がわからない。複数のプロバイダーに複数の OpaqueToken を使用していますが、リゾルバーはそれを使用できません。

コンソールのエラー メッセージは次のように表示されますが、これ以上の情報はありません。

エラー: トークンを定義する必要があります!

誰でもアイデアはありますか?

4

1 に答える 1

0
// import MyResolver and MyToken here

export const routes: Routes = [{
path: 'myPath',
component: MyComponent,
children: [
    {
        path: ':id',
        component: MyComponent,
        resolve: {
            itemData: MyResolver
            itemData: MyToken
        }
    }
]
}];
于 2017-02-25T14:10:14.767 に答える