我已经在Ember上工作了大约一个月了,但是我仍然对Ember中的各种钩子感到困惑。我对每件事都略知一二,但就是不会把它们拼凑起来。我理解模型,beforeModel和afterModel钩子的用法。setupController钩子是用来做什么的,它在生命周期中什么时候被调用。还有,renderTemplate钩子是用来做什么的。我一直在使用它来执行每次模板渲染时应该执行的功能,但在网上阅读后,我发现它是在想要在出口中渲染另一个模板时使用的,例如:
renderTemplate: function() {
this.render('favoritePost');
}
如果我在路由中定义了模型钩子和renderTemplate钩子,我开始得到错误,之后什么都不工作。我可以在哪里做应该在每次加载模板时做的事情。我知道我可以做一个类似的事情使用didInsertElement钩子为视图但我不能这样做没有创建一个视图?
最好的方法是阅读ember指南中的路由部分。
setupController钩子就像它的名字所说的那样——它用模型数据设置相关的控制器(或者你需要的控制器)。模型数据可以来自模型钩子(给定一个手动url),也可以来自一个链接到helper/transitionToRoute调用——每次你以两种方式输入这个路由时都会被调用。默认情况下,它会将模型作为'model'属性附加到隐含控制器上。
renderTemplate钩子通常只在你想要呈现的模板/视图不是按照该路由的命名约定设置的,或者钩子是一个不同于约定所隐含的控制器时才会用到。它还可以用于呈现到特定模板中的特定出口。默认情况下,它将使用隐含的控制器作为上下文来呈现隐含的视图/模板。
关于你的问题,你应该把你的代码放在哪里——因为它显然与视图层有关——你应该把它放在视图中,而不是放在路由器中。如果你坚持要把它放在路由器中——确保在重写这些钩子时调用了this._super()。
我在我的一个应用程序中使用renderTemplate,我们使用的语法是:
this.render({
into: 'viewName',
outlet: 'outletName'
});
我使用了你在这条路由中提到的两个钩子,并且没有任何问题。