2013-06-11 59 views
2

在“指定路由的模型”灰烬文档部分,它说的控制器的模型属性可以通过实现在路径模型钩被分配;它也说这个行为可以通过实现setupController钩子来改变。这使我得出结论,我可以通过做一个或另一个来分配模型。但是当我查看Ember文档中的“设置控制器”时,示例显示了需要具有两个参数的控制器&模型的setupController钩子。文档只是说“模型是路由处理器的模型,更多信息请参见指定路由模型。”这导致我得出结论,我需要做两个步骤。混淆在路由处理器中设置模型

如果我不需要做两个步骤,什么是一个与其他的有什么区别?

回答

1

在大多数情况下,你可以简单地覆盖model,忘记setupController。有时你根本不需要重写任何东西。

setupController的默认行为是将控制器的model属性(其别名为content属性)设置为当前路由的模型(作为参数提供)。通常这个论点是model钩的返回值,除非路线具有动态区段和经由{{linkTo}}被访问,{{render}},或类似物(即不直接从一个URL)。在这种情况下,model钩子被绕过,并且setupController被赋予在转换中提供的任何模型。

如果您的路由具有动态段时,model挂钩,使在你被默认搜索的内容的猜测。给定路径路径something/:post_id,默认model挂钩将返回App.Post.find(:post_id)。如果您的路线没有动态细分受众群(例如/posts),则必须覆盖model才能返回所需的记录。

如果您需要在控制器上设置modelcontent以外的其他属性,则应该覆盖setupController。这将绕过默认行为,因此您需要将模型参数分配给您的控制器的modelcontent属性(或不是)。如果你这样选择,你可以完全忽略模型参数,并将控制器的属性设置为任何你喜欢的。这种方法的缺点是,通过转换到具有动态段的路线提供的模型不会在控制器上设置。