Как управлять коллекцией представлений, которые имеют независимые выходы?
- Код здесь: https://github.com/midu/form_builder/
- Живая версия: http://midu.github.com/form_builder/
Есть ли способ, когда вы рендерите несколько раз представление, чтобы каждый из них был связан с экземпляром контроллера?
Я уверен, что это неправильный способ сделать это, поэтому я открыт для указаний на то, как я должен это делать. Но вот пример использования:
У меня есть эти маршруты:
FormBuilder.Router = Ember.Router.extend({
// ...
form: Ember.Route.extend({
route: '/form/:form_id/edit',
connectOutlets: function (router, form) {
router.get('applicationController').connectOutlet('editForm', form);
router.get('editFormController').connectOutlet( 'fieldsList', form.get('fields') );
},
editField: Ember.Route.transitionTo('editOneField'),
showField: Ember.Route.transitionTo('showOneField'),
initialState: 'showOneField',
editOneField: Ember.Route.extend({
connectOutlets: function (router, field) {
router.get('fieldsListController').connectOutlet('editField', field);
}
}),
showOneField: Ember.Route.extend({
connectOutlets: function (router, field) {
router.get('fieldsListController').connectOutlet('showField', field);
}
})
})
});
Я пытаюсь перечислить Field
в Form
в form
маршрут. Route
для этого есть:
form: Ember.Route.extend({
route: '/form/:form_id/edit',
connectOutlets: function (router, form) {
router.get('applicationController').connectOutlet('editForm', form);
router.get('editFormController').connectOutlet( 'fieldsList', form.get('fields') );
},
EditFormView
оказывает шаблон edit_form_view
:
<h2>Editing form {{id}}</h2>
{{view FormBuilder.AddFormFieldsView}}
{{ outlet }}
В котором мы соединяем outlet
к fieldsList
, Это делает fields_list
шаблон, и подключен к FieldsListController
контроллер, который является массивом Field
,
{{! fields_list.handlebards }}
<p>The form fields</p>
<ul>
{{#each content}}
{{view FormBuilder.FieldView}}
{{/each}}
</ul>
Так что это делает представление FieldView
который использует field_view
шаблон:
# {{publicName}}
{{outlet}}
И вот тут у меня проблема. Я не могу "подключить" это outlet
потому что это часть fieldsListController
,
Я опишу, что я пытаюсь сделать. У меня есть это в моем контроллере.
editField: Ember.Route.transitionTo('editOneField'),
showField: Ember.Route.transitionTo('showOneField'),
initialState: 'showOneField',
editOneField: Ember.Route.extend({
connectOutlets: function (router, field) {
router.get('fieldsListController').connectOutlet('editField', field);
}
}),
showOneField: Ember.Route.extend({
connectOutlets: function (router, field) {
router.get('fieldsListController').connectOutlet('showField', field);
}
})
Это означает, что при рендеринге outlet
в field_view.handlebars
будет связан с showField
:
<pre>show a field yo :)</pre>
<a {{action editField this}}>(edit)</a>
Если у меня есть только одно поле, и нажмите на (edit)
, переключится подключить outlet
с editField
, что так далеко, что я пытаюсь сделать. Тем не менее, если есть более 1 Field
в моем Form
когда я нажимаю (edit)
соединяет ВСЕ outlet
с editField
,
Это имеет смысл из-за этого router.get('fieldsListController').connectOutlet('showField', field);
, но я не знаю, как получить правильный экземпляр контроллера (и / или создать экземпляр контроллера для каждого из FieldView
s.
Я совершенно потерян прямо здесь. Я пытаюсь сделать "встроенное издание" без изменения всего представления, и это не похоже на хорошую документацию / учебные пособия о наличии набора представлений, каждый из которых имеет независимый outlet
...
Ссылки на всю кодовую базу и онлайн-версию находятся вверху страницы.
1 ответ
Вы, вероятно, ищете {{control}}
хелпер, который находится в стадии разработки, но доступен в исходном коде Ember.js. Этот помощник разработан таким образом, что он создает экземпляр контроллера для каждого использования этого помощника.