2013-07-17 25 views
2

这是一个非常基本的,但由于某种原因,我无法得到它的工作。如何访问控制器中的模型?

我创建了一个公司的资源:

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() {},但我不清楚的差异。我已经尝试过两次,都没有成功。

任何想法?

回答

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

你正在声明你的'长度'作为一个属性,而没有观察到对控制器内容的任何改变,所以,当控制器的实例被创建时,它是0,这就是为什么它永远不会更新,你可以或者做Panagiotis说的或者你也可以观察内容的'@each'属性:

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

不错。 '@each'和'@ each.name'之间有什么区别?第一个将在任何属性更改时重新计算,第二个仅当name属性更改时才会重新计算? –

相关问题