0

如果我有这样的模板:

<script type="text/x-handlebars" data-template-name="listbeer">
    {{#each controller}}
    <li>{{aname}}</li>
    {{/each}}
    </script>

然后什么都不会显示。另一方面,如果我这样做:

<script type="text/x-handlebars" data-template-name="listbeer">
    {{#each DHApp.beerlistController}}
    <li>{{aname}}</li>
    {{/each}}
    </script>

它有效,我从控制器显示的内容中获取列表。为什么是这样?在前一种情况下,我看到了什么控制器。请注意,我已将它们绑定在视图中,或者我认为:

DHApp.ListbeerView = Ember.View.extend({
        templateName: 'listbeer',
});
DHApp.listbeerView = DHApp.ListbeerView.create({
    controller: DHApp.listbeerController,
    contentBinding: 'controller.content'
});

所以我希望看到同样的情况。请注意,控制器是一个数组,正如我在上面所说的,如果我在每个循环中指定控制器

更新:如果我这样做

{{controller}} {{DHApp.listbeerController}}

然后我得到

<DHApp.ListbeerController:ember192> <DHApp.ListbeerController:ember149>

看起来我收到的是默认控制器,而不是我实例化的那个。

那么有没有办法将视图的控制器设置为我的实例化控制器。或者一种在路由之外获取自动实例化控制器的方法。我想访问控制器,这样我就可以在 ajax 响应、计时器和类似的东西中更新控制器模型

4

2 回答 2

0

这很可能是上下文问题。默认情况下,控制器将是它被渲染到的模板的上下文。如果您执行以下操作:

  <script type="text/x-handlebars" data-template-name="listbeer">
  {{controller}}
  {{#each controller}}

控制器很可能是 ApplicationController(如果没有显示更多的实现很难说)。

通常,您不会直接创建控制器,而是允许路由器创建控制器,这反过来将帮助您根据需要控制上下文。指南中有一些很好的例子:

http://emberjs.com/guides/routing/rendering-a-template/

于 2013-01-29T18:49:15.550 回答
0

如果您执行以下操作,情况会有所改善吗?因为需要使用get和set,而不是直接访问控制器。

DHApp.ListbeerView = Ember.View.extend({
        templateName: 'listbeer',
});
DHApp.listbeerView = DHApp.ListbeerView.create({
    controllerBinding: 'DHApp.listbeerController',
    contentBinding: 'controller.content'
});

此外,从代码的外观来看,您似乎使用的是旧版本的 Ember(或错误地实现了新的 Ember),因为如果控制器DHApp由 EmberJS 自动实例化,则无法再从变量中访问控制器,而是处理与在路由器中与this.controllerFor

于 2013-01-29T17:43:27.097 回答