2013-04-30 2 views
6

ダイナミックセグメントでルーティングするためのリンクを設定する方法を教えてください。私は私のテンプレートでこのダイナミックセグメントでルーティングするリンクを設定するには

window.App = Ember.Application.create() 
App.Router.map -> 
    @resource 'products' 
    @resource 'product', path: '/product/:product_id' 

で始まる導くためによると:

{{#linkTo "product.1"}}products{{/linkTo}} 

は、残念ながら、これは私にfollwingエラーを与える:

Uncaught Error: assertion failed: The attempt to linkTo route 'product.1' failed. 
The router did not find 'product.1' in its possible routes: 'products', 'product', 'index' 

答えて

10

{{linkTo}}ので、Router.mapで定義されたルートを期待あなたのマッピングによると、それは単にproductでなければなりません。

ダイナミックセグメントについては、ProductRouteにシリアル化されるオブジェクトも渡す必要があります。ほぼすべてのシナリオでシリアライゼーションが行われるのは、Emberが規約に依存しているため、開発者は何もする必要がありません。まれに、serializelittle differentlyを実装する必要がありますが、ほとんどの場合、手で触れる必要はありません。

あなたはこのようにそれを行うことができます{{each}}ループ内{{linkTo}}を使用している場合:

{{#each product in controller}} 
    {{#linkTo product product}}Details{{/linkTo}} 
{{/each}} 

または

{{#each controller}} 
    {{#linkTo product this}}Details{{/linkTo}} 
{{/each}} 

最初の引数はルート名であり、第二は、あなたのモデルであり、オブジェクト。最初のコードではオブジェクトの名前はproductですが、2番目のコードでは単純にthisとして渡されます。これは繰り返しの生成物です。

{{each}}ループを使用しないで動的ルートにリンクする必要がある場合は、controller(優先)またはviewにオブジェクトを公開する必要があります。そして、次のような何かをする必要があると思います:

App.SomeController = Em.Controller.extend 
    product: null 

App.SomeRoute = Em.Route.extend 
    ### 
    controller is actually `SomeController` here 
    model is not being used, and is null, while the actual model being 
    supplied to the controller is `product`, retrieved from store 
    ### 
    setupController: (controller, model) -> 
    product = App.Product.find 1 
    controller.set 'product', product 
    return 

テンプレートは、こののようになりますが:

{{#linkTo product controller.product}}Product{{/linkTo}} 

どのルートがIDを知っていますか?

Conventions。あなたが渡したオブジェクトはserializeで、そのルートのモデルの名前を持つ単一のプロパティを持つオブジェクトが公開され、その後は "_id"になります。この場合はproduct_idとなるので、そのリンクをクリックすると、アプリはProductRouteを有効にし、そのidプロパティを作成するserializeメソッドを実行します。その後、modelフックの引数として使用されます。それはfindを引数としてparams.product_idに渡すところです。次に、モデルはsetupControllerによって使用されるモデルの約束を返し、オブジェクトをビューレイヤーにcontroller.contentまたは単にcontrollerとして公開します。

+0

'#each'ループでは' product'を引用する必要がありました: '{{#linkTo 'product' this}}詳細{{/ linkTo}}'。 –

関連する問題