2016-04-23 19 views
0

角2では、の配列を示すMyObjectComponentがあります。私はこのmyObjectsをによって呼び出されるMyObjectServiceから得る。Angular2:@CanActivate()からのオブジェクトをコンポーネントに渡す - > Typescriptエラー

routerOnActivate(next) { 
    this.myComponentObjectVariable = next.params.myObjects; 
} 

を経由して、私はデータを取得し、私のコンポーネントで

@CanActivate((next: ComponentInstruction, previous: ComponentInstruction) => { 

    let myObjectService: MyObjectService = //get my ObjectService here.... 

    return new Promise((resolve) => { 
     myObjectService.getMyObjects() 
      .subscribe((myObjects) => { 
       next.params['myObjects'] = myObjects; 
       resolve(true); 
      }); 
    }) 

これは動作しますが、私はnext.params['myObjects']に追加myObjectsは、文字列の場合のみ。

私はオブジェクトを追加する場合、私は

Typescript error: TS2322: Type 'any[]' is not assignable to type 'string'.

を取得しますただし、期待どおり結果JavaScriptが動作します。しかし、私はTypescriptエラーメッセージを取り除きたい。

ためComponentInstruction内のparamsオブジェクトの定義のエラー結果:もちろん

declare class ComponentInstruction { 
    ... some other data ... 
    params: { 
     [key: string]: string; 
    }; 
} 

私はクラスComponentInstructionを変更することができますが、それは少し醜いだろう。

誰もがこのエラーメッセージを取り除く方法を知っていますか?

答えて

1

paramsは不変として扱われるはずです。

このコメントhttps://github.com/angular/angular/issues/4112#issuecomment-153811572にリンクされているPlunkerに示されている方法を使用し、route paramsの代わりに共有サービスを使用して値を渡すことをお勧めします。

別の方法は

_router.navigate(...)を使用して、そこにカスタムルートパラメータを渡すことです。

この場合、アプリケーションを取得するには、Plunkerで実証されたアプローチが必要です(Routerインスタンス)。

+0

私の目的は、ルーティングする前にデータを解決することです。これはルート定義で 'resolve'を使ってAngular1で可能でした。 新しいサービスを作成する必要があります。この新しいサービスは '@CanActivate()'からデータを受け取り、 '@CanActivate()'は保存処理が完了したときに約束を解決します。次に、データを待たずに新しいサービスをMyComponentで使用することができます。 これは少し過剰ですか?アプリケーションに異なるタイプのMyObjectsがある場合、データを共有するための特別なサービスをすべてのタイプに対して記述する必要があります。または、型安全性を持たないすべての「MyObjects」の一般サービス。 –

+0

Angularチームは、ルータに重大な制限があることを認識しています。ルータは進行中です。予想される多くの変更があります。 –

+1

ありがとうございます。 データを共有するサービスを使用してソリューションを試しました。近いうちに別の解決策が用意されることを願っています。 –

関連する問題