Ember.js:ArrayController在模板中未定义

时间:2013-11-22 15:50:42

标签: ember.js

问题:

我有点挣扎着我的第一个ember应用程序的组织。当前的问题是我的Items模板中未定义my dashboard ArrayController:

<script type="text/x-handlebars" data-template-name="dashboard">
    {{#if controllers.items}}
        <p class="alert alert-error">Dashboard can access item's info - Nice!</p>
    {{else}}
        <p class="alert alert-error">Dashboard cannot access items... :-/</p>
    {{/if}}
</script>

可能原因: *

**编辑:在与@conrad谈话之后,我有点质疑:*

我在earlier post中遇到过类似的问题,而且他的建议原因是我:

  

“从未创建任何使用选项控制器的东西”。

这也可能就是这种情况。 This quick screencast显示我的ArrayController上的断点未在页面加载时被点击 - 但当我在Ember检查器工具中检查Items控件时, 被点击(例如, ,Ember第一次创建了ArrayController对象。

明显的非解决方案:

我的Dashboard控制器说它需要Items控制器。我想这还不足以实例化ArrayController?

App.ItemsController = Ember.ArrayController.extend({
  len: function(){
    return this.get('length');
  }.property('length'),

  totalCost: function() {
    return this.reduce( function(prevCost, item){
      return parseInt(item.get('values').findBy('type', 'cost').price, 10) + prevCost;
    }, 0);
  }.property('@each.values')

  [more computed properties...]

});

App.DashboardController = Em.Controller.extend({
  needs: ['items'],
  itemsLength: Ember.computed.alias('controllers.items.len'),
  itemsTotalCost: Ember.computed.alias('controllers.items.totalCost'),

  [more computed properties...]
}); 

此外,Items 中的每个项目 都会在我的items模板中呈现。我想这不会创建丢失的controllers.items ......

<script type="text/x-handlebars" data-template-name="items">
    {{#each}}
        [these render fine]
    {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="display">
<!-- DISPLAY TEMPLATE -->

    {{!- DASHBOARD -}}
    {{render dashboard}}

    {{!- ITEMS -}}
    {{render 'items' items}}

</script>

那么..什么?

我可以想象很多可能的途径,但还没有让它们中的任何一个工作:

  • {{render dashboard}}
  • 中指定Items ArrayController
  • 路线中的某些配置?
  • 也许我的模板/路线没有正确排列?

Ember view tree Ember routes

1 个答案:

答案 0 :(得分:0)

您可以通过在ItemController的初始化函数中调用DashboardController来确保App.DashboardController = Em.Controller.extend({ needs: ['items'], init: function() { this._super(); this.get('controllers.items.length'); } }); 在仪表板模板中实例化:

{{1}}

/编辑:

删除了无用的部分