- Код находится здесь: https://github.com/midu/form_builder/
- Живая версия: http://midu.github.com/form_builder/#/forms
Есть ли способ, когда вы несколько раз рендерите представление, чтобы каждое из них было связано с экземпляром контроллера?
Почти уверен, что это неправильный способ сделать это, поэтому я открыт для указаний о том, как я должен это делать. Но вот вариант использования:
У меня есть эти маршруты:
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
, что я пока и пытаюсь сделать. Однако, если в моем Form
больше 1 Field
, когда я нажимаю (edit)
, он соединяет ВСЕ outlet
с editField
.
Это имеет смысл из-за этого router.get('fieldsListController').connectOutlet('showField', field);
, но я не знаю, как получить правильный экземпляр контроллера (и/или создать экземпляр контроллера для каждого из FieldView
s.
Я совсем потерялся прямо здесь. Я пытаюсь сделать «встроенную версию» без изменения всего представления, и это не кажется хорошей документацией/учебниками о наличии набора представлений, каждое из которых имеет независимый outlet
...
Ссылки на всю базу кода и онлайн-версию находятся вверху страницы.