hasMany的itemController

时间:2013-08-22 03:18:55

标签: ember.js

我一直在努力解决以下问题:如何将一个itemController分配给hasMany关系中的子元素?

我的用例如下:我有一个Ember.View(ProjectView),我在其中使用Google Maps API操作地图上的区域。我有一个区域模型和项目模型“hasMany”区域。

我的应用程序中没有任何保存按钮等,而是在发生更改时同步更改后端(使用去抖功能)。为了避免讨厌的inFlight错误,我使用的是Ember.AutoSaving插件https://github.com/gaslight/ember-autosaving的修改版本,它可以缓冲我的更改并在模型准备好时与模型同步。但是,为了使用它,我需要将一个使用此Mixin的itemController应用于我的hasMany关系中的每个Area。我该怎么做?

1 个答案:

答案 0 :(得分:3)

Handlebars {{each}}助手有一个itemController选项。指定此选项时,每个对象都将由控制器实例包装。所以这样的事情应该有效:

//from your project template
{{#each area in areas itemController="area"}}
  <pre>
    area is an AreaController: {{area}}
    area.content is a reference to the model: {{area.content}}
{{/each}}

有关详细信息,请参阅[车把{{each}} API文档](http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_each

编辑:选项2

作为使用{{each}}帮助程序的替代方法,使用ArrayController表示集合并设置它的itemController属性。例如:

App.AreasController = Ember.ArrayController.extend({
  itemController: 'area'
});

App.AreaController = Ember.ObjectController.extend( Ember.AutoSaving, {
  bufferedFields: ['title', 'body'],
  instaSaveFields: ['postedAt', 'category'],
  titleLength: function() {
    return this.get('title').length;
  }.property('title')
});

// In your project route:
setupController: function(controller, model) {
  this.controllerFor('areas').set('content', model.areas);
}

现在区域控制器将每个项目包装在AreaController代理中。

请参阅Ember ArrayController API docs