我继承了一个代码库并试图理解什么是什么。在emberjs应用程序中,我如何知道哪个控制器(js)对应于特定页面上的视图(hbs)。有设置吗?有会议吗?
答案 0 :(得分:1)
惯例是他们的名字(或更确切地说是他们的路径)应该是相同的。
同样,controllers/page.js
应该有templates/page.hbs
和routes/page.js
如果使用ember new
或ember twiddle创建新的Ember项目,则可以看到此约定。
您还可以使用templateName
属性在路线中指定模板名称。
// routes/page.js
import Route from '@ember/routing/route';
export default Route.extend({
templateName: 'something/different'
});
Ember还允许我们在路线中使用renderTemplate
钩子并选择不同的模板和/或不同的控制器。
// routes/page.js
export default Route.extend({
renderTemplate(controller, model) {
// Render the `something/else` template
// and use the and `other/thing` controller
this.render('something/else', {
controller: this.controllerFor('other/thing')
});
}
});
Read more in "Ember JS Guides: Rendering a template"
Ember还习惯使用partial
帮助器在其他模板中嵌入模板。
使用Ember版本会很重要因为这会限制您对某种API行为的关注,因为Ember在这些年中确实发生了很大变化。
答案 1 :(得分:0)
在大多数情况下,它非常简单。 Ember遵循惯例而不是配置,所以让我们学习惯例。算法如下。
/foo
router.js
文件,找到与此网址格式匹配的路由。如果您未指定paths
,那么url将只是路由的名称,但您也可以处理嵌套路由。假设我们找到名为foo.js
的路线,该路线位于appName/routes/foo.js
。model
挂钩中获取数据,然后通过controller
挂钩在相应的setupController(controller, model)
实例上设置变量。未指定时,此方法仅在控制器上设置整个模型对象。现在我们应该对控制器上动态设置的变量有一个很好的了解。 appName/controllers/foo.js
下打开控制器。考虑控制器的最佳方法是它们是相应模板(appName/templates/foo.hbs
)的单一状态源。它们的值是通过路径上的钩子设置的,也可以通过init
方法,计算属性,观察者等设置的。当您在手柄模板中引用任何{{variable}}
时,控制器匹配此部分页面的上下文是解析此变量的状态源。如果未定义控制器,则Ember会自动为您生成一个控制器。值得注意的是,控制器是单身人士,他们的状态在路线变化之间持续存在。 appName/components/component-name.js
下,并将其模板存储在appName/templates/components/component-name.hbs
中,或者如果javascript文件只能指定tagName
则没有模板就是这样。 另一个快速的事情:在父/子层次结构中调用路由,并通过路由对应于URL。顶级路线是申请路线。如果您查看它的模板,您会发现{{outlet}}
Ember将找到接下来的子路线,并将其模板渲染到此插座中。默认情况下/
,会呈现index
路线的模板。但如果网址为/foo
,则foo.hbs
将呈现在应用程序的插座中。 Foo.hbs可以有一个插座,当我们开始进入嵌套路由时就是这样。这就像我可以提供的快速/高级概述,如果你想要具体细节,我会问任何问题(我喜欢Ember)