2013-08-22 4 views
0

Я некоторое время боролся со следующим вопросом: как назначить элемент itemController дочерним элементам в отношениях hasMany?itemController for hasMany

Мой вариант использования: У меня есть Ember.View (ProjectView), в котором я управляю областями на карте с помощью API Карт Google. У меня есть модель для Area и Project model "hasMany".

У меня нет кнопок сохранения и т. П. В моем приложении, а скорее синхронизация изменений в бэкэнд при изменении (с использованием функции debounce). Чтобы избежать неприятных ошибок inFlight, я использую модифицированную версию плагина Ember.AutoSaving https://github.com/gaslight/ember-autosaving, который буферизирует мои изменения и синхронизирует их с моделью, когда она будет готова. Однако, чтобы использовать это, мне нужно применить itemController, используя этот Mixin для каждого Area в моем hasMany отношении. Как мне это сделать?

ответ

3

Руль {{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}} 

Смотрите [рули {{каждый}} API Docs] (http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_each) для получения более подробной информации

EDIT: Вариант 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

+0

спасибо Майку, но это не будет работать, как я не оказывающего области, как это. Скорее я создаю многоугольники из областей API Карт Google (на мой взгляд) и синхронизирую назад изменения. – chopper

+0

А, ок. Редактирование моего ответа с альтернативой, которая должна работать в этом случае. –

+0

Ах спасибо Майку, это было очень полезно. Я все еще хочу, чтобы был способ указать «Default» ObjectController, который используется, если не переопределен. – chopper

Смежные вопросы