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

And*_*rle 6 ember.js ember-router

如何设置与动态段路由的链接.根据指南,我从这开始

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

在我的模板中:

{{#linkTo "product.1"}}products{{/linkTo}}
Run Code Online (Sandbox Code Playgroud)

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

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' 
Run Code Online (Sandbox Code Playgroud)

Mil*_*Joe 10

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

至于动态段,你还必须传递一个将被序列化的对象ProductRoute.几乎所有场景中的序列化都是在没有开发人员必须做任何事情的情况下进行的,因为Ember依赖于约定.在极少数情况下,必须serialize不同的方式实现,但在大多数情况下,您不必触摸它.

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

{{#each product in controller}}
    {{#linkTo product product}}Details{{/linkTo}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

要么

{{#each controller}}
    {{#linkTo product this}}Details{{/linkTo}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

第一个参数是路径名称,第二个参数是模型对象.在第一个代码中,对象也被命名为product,而在第二个代码中,它只是被传递为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
Run Code Online (Sandbox Code Playgroud)

虽然您的模板与此类似:

{{#linkTo product controller.product}}Product{{/linkTo}}
Run Code Online (Sandbox Code Playgroud)

路线如何知道身份证?

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