我一直在努力解决以下问题:如何将一个itemController分配给hasMany关系中的子元素?
我的用例如下:我有一个Ember.View(ProjectView),我在其中使用Google Maps API操作地图上的区域。我有一个区域模型和项目模型“hasMany”区域。
我的应用程序中没有任何保存按钮等,而是在发生更改时同步更改后端(使用去抖功能)。为了避免讨厌的inFlight错误,我使用的是Ember.AutoSaving插件https://github.com/gaslight/ember-autosaving的修改版本,它可以缓冲我的更改并在模型准备好时与模型同步。但是,为了使用它,我需要将一个使用此Mixin的itemController应用于我的hasMany关系中的每个Area。我该怎么做?
答案 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代理中。