如何设置与动态段路由的链接.根据指南,我从这开始
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'
解决方法
{{linkTo}}
期望路由器中定义的路由,因此根据您的映射,它应该只是产品.
对于动态段,您还必须传递将在ProductRoute中序列化的对象.几乎所有场景中的序列化都是在没有开发人员必须做任何事情的情况下进行的,因为Ember依赖于约定.在极少数情况下,必须实现序列化little differently,但在大多数情况下,您不必触摸它.
如果您在{{each}}循环中使用{{linkTo}},可以这样做:
{{#each product in controller}} {{#linkTo product product}}Details{{/linkTo}} {{/each}}
要么
{{#each controller}} {{#linkTo product this}}Details{{/linkTo}} {{/each}}
第一个参数是路径名称,第二个参数是模型对象.在第一个代码中,对象也被命名为product,而在第二个代码中,它只是被传递为this,这是迭代的产物.
如果您有一个不寻常的情况,您必须在不使用{{each}}循环的情况下链接到动态路由,则必须在控制器(首选)或视图中公开该对象.然后你必须做类似以下的事情:
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}}
路线如何知道身份证?
Conventions.路由将serialize
传递给您传递的对象,并使用单个属性公开一个对象,该属性具有该路由的模型名称,后跟“_id”,在本例中为product_id,因此当您单击该属性时链接,应用程序激活ProductRoute,运行serialize方法创建该id属性,该属性随后将用作model
钩子的参数.这就是你调用find将params.product_id作为参数传递的地方.然后模型返回该模型的承诺,该承诺将由setupController
使用,将对象作为controller.content或简单的控制器暴露给视图层.