英文原文:http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/

Ember.ArrayController用于代表一组模型。通过在路由的setupController方法中设置ArrayControllermodel属性,来指定其代表的模型。

可以将ArrayController作为一个数组来对待。例如,音乐播放器希望显示当前播放列表。在路由中,通过设置SongsController来代表播放列表中的歌曲。

  1. App.SongsRoute = Ember.Route.extend({
  2. setupController: function(controller, playlist) {
  3. controller.set('model', playlist.get('songs'));
  4. }
  5. });

songs模板中,可以使用{{#each}}助手来显示歌曲。

  1. <h1>Playlist</h1>
  2. <ul>
  3. {{#each}}
  4. <li>{{name}} by {{artist}}</li>
  5. {{/each}}
  6. </ul>

另外,可以使用ArrayController来收集一些模型所代表的聚合类信息。例如,音乐播放器需要显示超过30秒长的歌曲的数量。那么只需要在控制器中添加一个名为longSongCount的计算属性。

  1. App.SongsController = Ember.ArrayController.extend({
  2. longSongCount: function() {
  3. var longSongs = this.filter(function(song) {
  4. return song.get('duration') > 30;
  5. });
  6. return longSongs.get('length');
  7. }.property('@each.duration')
  8. });

现在便可以在模板中使用该属性。

  1. <ul>
  2. {{#each}}
  3. <li>{{name}} by {{artist}}</li>
  4. {{/each}}
  5. </ul>
  6. {{longSongCount}} songs over 30 seconds.

排序

Ember.ArrayController使用Ember.SortableMixin来支持排序。为了支持排序,需要设置两个属性:

  1. App.SongsController = Ember.ArrayController.extend({
  2. sortProperties: ['name', 'artist'],
  3. sortAscending: true // false for descending
  4. });

条目控制器

在遍历ArrayController的条目时,指定一个控制器来装饰单个条目非常有用。这可以在ArrayController中进行定义:

  1. App.SongsController = Ember.ArrayController.extend({
  2. itemController: 'song'
  3. });

或者在模板中指定:

  1. {{#each itemController="song"}}
  2. <li>{{name}} by {{artist}}</li>
  3. {{/each}}