我已经在Ember上工作了大约一个月,但我仍然对Ember中的各种钩子感到困惑。我知道所有东西的零碎,但不能将它们拼接在一起。我理解model,beforeModel和afterModel钩子的用法。什么是setupController钩子用于什么以及何时在生命周期中调用它。另外renderTemplate挂钩用于什么。我一直在使用它来执行每次渲染模板时应该执行的功能,但是在线阅读之后,我发现当想要在插座中渲染另一个模板时使用它,如:
renderTemplate: function() {
this.render('favoritePost');
}
如果我在路由中定义了模型钩子和renderTemplate钩子,那么我开始得到错误,之后没有任何工作。我在哪里可以做每次加载模板时应该完成的事情。我知道我可以使用didInsertElement钩子为视图做类似的事情但是我不能创建视图吗?
答案 0 :(得分:3)
最好的办法是阅读ember guides中的路由部分。
setupController挂钩正如其名称所说的那样 - 它使用模型数据设置相关的控制器(或控制器,如果需要)。 模型数据可以来自模型钩子(给定手动URL)或链接到助手/ transitionToRoute调用 - 因此每次以任一方式进入此路径时都会调用。 默认情况下,它会将模型作为“模型”属性附加到隐含控制器。
只有在您希望渲染的模板/视图不是此路由的命名约定所设置的模板/视图,或者挂钩与隐含约定的控制器不同的控制器时,才会使用renderTemplate挂钩。 它还可用于渲染到特定模板中的特定插座。 默认情况下,它将使用隐含的控制器作为上下文呈现隐含的视图/模板。
关于你的问题你应该在哪里找到代码 - 因为它显然与视图层有关 - 你应该把它放在视图中,而不是放在路由器中。 如果你坚持把它放在路由器中 - 确保在覆盖这些钩子时调用this._super()。
答案 1 :(得分:0)
我在我的一个应用程序中使用了renderTemplate,我们使用的语法是:
this.render({
into: 'viewName',
outlet: 'outletName'
});
我使用了你在这条路线中陈述的两个钩子,并且没有任何问题。