0

我一直在为以下问题苦苦挣扎:如何将 itemController 分配给 hasMany 关系中的子元素?

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

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

4

1 回答 1

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}}

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

编辑:选项 2

作为使用{{each}}助手的替代方法,使用 anArrayController来表示集合并设置它的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 文档

于 2013-08-22T04:40:54.453 回答