EmberJS:如何找到用于驱动.hbs视图的控制器?

时间:2018-01-19 18:17:10

标签: javascript ember.js

我继承了一个代码库并试图理解什么是什么。在emberjs应用程序中,我如何知道哪个控制器(js)对应于特定页面上的视图(hbs)。有设置吗?有会议吗?

2 个答案:

答案 0 :(得分:1)

惯例是他们的名字(或更确切地说是他们的路径)应该是相同的。

同样,controllers/page.js应该有templates/page.hbsroutes/page.js

如果使用ember newember 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遵循惯例而不是配置,所以让我们学习惯例。算法如下。

  1. 查看您当前的网址。在这种情况下,我们在/foo
  2. 打开router.js文件,找到与此网址格式匹配的路由。如果您未指定paths,那么url将只是路由的名称,但您也可以处理嵌套路由。假设我们找到名为foo.js的路线,该路线位于appName/routes/foo.js
  3. 之下
  4. 打开路径文件。路由作业是在model挂钩中获取数据,然后通过controller挂钩在相应的setupController(controller, model)实例上设置变量。未指定时,此方法仅在控制器上设置整个模型对象。现在我们应该对控制器上动态设置的变量有一个很好的了解。
  5. appName/controllers/foo.js下打开控制器。考虑控制器的最佳方法是它们是相应模板(appName/templates/foo.hbs)的单一状态源。它们的值是通过路径上的钩子设置的,也可以通过init方法,计算属性,观察者等设置的。当您在手柄模板中引用任何{{variable}}时,控制器匹配此部分页面的上下文是解析此变量的状态源。如果未定义控制器,则Ember会自动为您生成一个控制器。值得注意的是,控制器是单身人士,他们的状态在路线变化之间持续存在。
  6. 打开template.hbs文件以查看您的标记。您可能有组件(自定义html外观标签,可以使用attrs)将其javascript存储在appName/components/component-name.js下,并将其模板存储在appName/templates/components/component-name.hbs中,或者如果javascript文件只能指定tagName则没有模板就是这样。
  7. 另一个快速的事情:在父/子层次结构中调用路由,并通过路由对应于URL。顶级路线是申请路线。如果您查看它的模板,您会发现{{outlet}} Ember将找到接下来的子路线,并将其模板渲染到此插座中。默认情况下/,会呈现index路线的模板。但如果网址为/foo,则foo.hbs将呈现在应用程序的插座中。 Foo.hbs可以有一个插座,当我们开始进入嵌套路由时就是这样。这就像我可以提供的快速/高级概述,如果你想要具体细节,我会问任何问题(我喜欢Ember)