7

如何设置链接以使用动态段进行路由。根据指南,我从这个开始

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' 
4

1 回答 1

11

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

至于动态段,您还必须传递一个将在ProductRoute. 由于 Ember 依赖于约定,因此几乎所有场景中的序列化都无需开发人员做任何事情。在极少数情况下,您必须实现serialize一点不同,但在大多数情况下,您不必碰它。

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

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

或者

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

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

如果您有一个不寻常的场景,您必须在不使用循环的情况下链接到动态路由{{each}},您必须在controller(preferred) 或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?

公约。该路由将serialize传递您传递的对象,并公开一个具有单个属性的对象,该属性具有该路由的模型名称,后跟“_id”,在这种情况下为product_id,因此当您单击该链接时,应用程序激活ProductRoute,运行创建该 id 属性的序列化方法,该属性随后将用作model钩子的参数。这就是您将find传递params.product_id称为参数的地方。然后模型返回该模型的承诺,该模型将被 使用,将对象作为或简单地setupController暴露给视图层。 controller.contentcontroller

于 2013-04-30T23:30:57.707 回答