如何设置与动态段路由的链接

时间:2013-04-30 22:08:13

标签: ember.js ember-router

如何设置使用动态细分的路线链接。根据指南,我从这个开始

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

在我的模板中:

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

不幸的是,这给了我以下错误:

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' 

1 个答案:

答案 0 :(得分:10)

{{linkTo}}期望在Router.map中定义路线,因此根据您的映射,它应该只是product

对于动态细分,您还必须传递一个将在ProductRoute中序列化的对象。几乎所有场景中的序列化都是在没有开发人员必须做任何事情的情况下进行的,因为Ember依赖于约定。在极少数情况下,必须实施serialize一个little differently,但在大多数情况下,您无需触摸它。

如果您在{{linkTo}}循环中使用{{each}},可以这样做:

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

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

第一个参数是路径名,第二个参数是模型对象。在第一个代码中,对象也被命名为product,而在第二个代码中,它只是作为this传递,这是迭代的产物。

如果您有不寻常的情况需要在不使用{{each}}循环的情况下链接到动态路线,则必须在controller(首选)或{{1}中公开对象}。然后你必须做类似以下的事情:

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

路线如何知道ID?

Conventions。路由将serialize您传递的对象,并使用单个属性公开对象,该属性具有该路由的模型名称,后跟“_id”,在本例中为{{#linkTo product controller.product}}Product{{/linkTo}} ,因此当您单击该链接时,应用程序会激活product_id,运行serialize方法创建该id属性,该属性随后将用作model挂钩的参数。这就是你调用ProductRoute作为参数传递find的地方。然后,模型返回该模型的承诺,setupController将使用该承诺,将对象公开为视图层params.product_id或简称controller.content