2016-03-18 24 views
2

内のサービスに、私は次のようなサービスがあります。使用RouteParams角度2

import {Injectable} from 'angular2/core'; 
import {Router, RouteParams} from 'angular2/router'; 

@Injectable() 
export class QService { 
    /* A service to handle a query (q) in the search string. 
    */ 
    constructor(
     private _router:Router, 
     routeParams:RouteParams 
    ) { 
    /* Set this._q from the search string. 
    */ 
    this._q = routeParams.get('q'); 
    } 

    private _q:string 
    get q():string { 
    return this._q; 
    } 
    set q(q:string) { 
    this._q = q; 
    // TODO Add q back to the search string. 
    } 
} 

は残念ながら、関係なく、私はこのサービスを使用する方法、私はNo provider for RouteParamsの線に沿ってエラーを取得していません。私は困惑している。私が逃したこれを行うためのいくつかの推奨または簡単な方法はありますか?

+0

あなたが ''ブートストラップ(AppComponent、[ROUTER_PROVIDERS]) 'へROUTER_PROVIDERS'を追加しましたか? –

+0

このコメントは、Stack Overflowのやや奇妙なルールのために必要以上に長くなっています。ええ、やりますよ。 – astex

+0

あなたはあなたのコードの最後にQService.params = [[Router]、[RouteParams]]を試すことができますか?また、私は注射液を追加します:[RouteParams]、これは私の@Componentの中にあります。あなたも同様にこれを試すことができます –

答えて

1

私はあなたのアプリケーションをブートストラップするときではない属性とそのプロバイダ内(ルーティングに関与)成分のレベルでこのサービスを指定する必要があると思う:

@Component({ 
    (...) 
    providers: [ QService] 
}) 
export class... 

事実RouteParamsの問題のみ適用されますコンポーネントのコンテキストではなく、アプリケーションに対してグローバルではありません。したがって、アプリケーションインジェクタは、子インジェクタ(コンポーネント1)にのみ存在するため、このプロバイダの知識はありません。

これは、注入および階層インジェクタを依存関係にリンクされています。詳細については、この質問を参照してください:

+0

私は指示通りにプロバイダとしてサービスを使用します。ルーティングと何かを削除すると、サービスは期待通りに機能します。しかし、コンポーネントがサービスをラップし、検索文字列の変更を処理することが懸念されているように思えます。特に、qが変化したときに検索文字列を更新したいからです。私は角度がこれを行うために規定した "正しい"方法を見てうれしいです。 – astex