如何在控制器中访问模型?

时间:2013-07-17 21:07:15

标签: ember.js

这是一个非常基本的,但由于某种原因,我无法让它发挥作用。

我创建了公司资源:

App.Router.map(function() {
    this.resource('companies');
});

并指定了一个模型

App.Company = DS.Model.extend({
    name: DS.attr('string'),
});

App.CompaniesRoute = Ember.Route.extend({
    model: function() {
        return App.Company.find();
    }
});

我有一些测试数据的灯具。

现在,我不应该从控制器访问我的companies数据吗?喜欢这个

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

我得到0,我在这个函数中尝试过的所有内容都让我想到控制器没有加载数据 - 即使我能够遍历模板中的模型,如下所示:

  <script type="text/x-handlebars" data-template-name="companies">
    <div class="row">
      <div class="span12">
        <h3>Companies</h3>
        {{#each controller}}
          <li>{{ name }}</li>
        {{/each}}
        </ul>
      </div>
    </div>
  </script>

文档的某些部分显示setupController而不是model: function() {},但我不清楚这些差异。我试过两次都没有成功。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该声明属性(或属性)的路径,Computed Property取决于。在这种情况下,content.length

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

或使用Binding

App.CompaniesController = Ember.ArrayController.extend({
    lengthBinding: 'content.length'
});

但是计算属性比绑定(内部)需要更少的工作,并且通常更快。

答案 1 :(得分:1)

你将'长度'声明为属性而不观察控制器内容的任何变化,因此,当创建控制器的实例时,它为0,这就是为什么它永远不会更新,你可以做Panagiotis说的话,或者你也可以观察内容的'@each'属性:

App.CompaniesController = Ember.ArrayController.extend({
  length: function () {
    return this.get('length');
  }.property('@each')
});