在Ember文档的“指定路径模型”部分中,它表示可以通过在路径中实现模型钩子来分配控制器的模型属性;它还说可以通过实现setupController挂钩来改变这种行为。这使我得出结论,我可以通过做一个或另一个来分配模型。但是,当我查看Ember文档中的“设置控制器”时,示例显示了setupController挂钩需要一个带有两个参数的函数:controller&模型。文档只是说“模型是路由处理程序的模型。有关更多信息,请参阅指定路径模型。”这使我得出结论,我需要做两个步骤。
如果我不需要同时执行这两个步骤,那么一个与另一个之间的区别是什么?
答案 0 :(得分:1)
在大多数情况下,您只需覆盖model
并忘记setupController
。有时你根本不需要覆盖任何东西。
setupController
的默认行为是将控制器的model
属性(属于content
属性)设置为当前路由的模型(作为参数提供)。通常此参数是model
挂钩的返回值,除非路由具有动态段并且可以通过{{linkTo}}
,{{render}}
等访问(即不直接来自网址) )。在这种情况下,model
挂钩被绕过,setupController
被赋予转换中提供的任何模型。
如果您的路线有动态细分,model
挂钩会默认猜测您要查找的内容。给定路径something/:post_id
,默认的model
挂钩将返回App.Post.find(:post_id)
。如果您的路线没有动态细分(例如/posts
),那么您必须覆盖model
才能返回所需的记录。
如果您需要在控制器上设置model
或content
之外的其他属性,则应覆盖setupController
。这将绕过默认行为,因此您可以将模型参数分配给控制器的model
或content
属性(或不)。如果您这样选择,您可以完全忽略模型参数并将控制器的属性设置为您喜欢的任何属性。这种方法的缺点是,转换到具有动态段的路径所提供的模型将不会在控制器上设置。