如何设置使用动态细分的路线链接。根据指南,我从这个开始
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'
答案 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
。