`controller`是Ember中视图上下文中的特殊关键字

时间:2012-10-04 06:12:39

标签: ember.js

今天我第四次阅读Trek's tutorial,希望这次能得到它(不要误解我的意思,这是一个很棒的资源,但我对客户端开发很新,发现该教程更倾向于专家)。无论如何,我注意到了这段代码:

<script type="text/x-handlebars" data-template-name="contributors">
  {{#each person in controller}}
    {{person.login}}
  {{/each}}
</script>

很明显,我们在这里迭代控制器中的项目并在每次迭代中将它们称为person。但controller引用来自何处?这是一个由Ember定义并在每个视图的上下文中可用的特殊关键字吗?

如果controller是Ember提供的特殊参考,我想了解更多有关它是如何工作的信息。您能否指出我的文档甚至是Ember源,其中定义了这样的关键字,以便我可以从视图内部了解其他参考资料以及它们如何工作?

1 个答案:

答案 0 :(得分:2)

不,它不是一个特殊的关键字,它只是view的一个属性,它是在使用下面描述的connectOutlet方法时设置的:

index: Ember.Route.extend({
  route: '/',
  connectOutlets: function(router){
    router.get('applicationController').connectOutlet('allContributors', [
      {login:'wycats'},
      {login:'tomdale'}
    ]);
  }
})

如果你在下面的例子中看到,你会看到:

  

控制器能够在他们控制的视图中连接插座。在上面的例子中,我使用'allContributors'作为参数调用connectOutlet。这将为我们创建AllContributorsView的实例,将AllContributorsController的共享实例设置为视图的默认渲染上下文,并在应用程序模板中出现{{outlet}}的位置将其插入到视图层次结构中。第二个参数,我已经硬编码为两个对象文字的数组,被设置为控制器实例的内容。

所以connectOutlet方法:

  • 创建AllContributorsView
  • 的实例
  • AllContributorsController设置为视图的默认渲染上下文(这意味着视图的controller属性设置为App.router.allContributorsController,因为默认视图渲染上下文是其控制器,或者未设置控制器时的父视图上下文,请参阅the view context source code
  • 将视图插入{{outlet}}出现的位置
  • 设置AllContributorsController实例(此处为[{login:'wycats'}, ...]
  • 的内容

我建议你完整阅读这篇文章,然后尝试自己动手。 您还可以阅读很多Ember资源,请参阅this StackOverflow answer