Как управлять набором представлений, которые имеют независимые выходы?

Есть ли способ, когда вы несколько раз рендерите представление, чтобы каждое из них было связано с экземпляром контроллера?

Почти уверен, что это неправильный способ сделать это, поэтому я открыт для указаний о том, как я должен это делать. Но вот вариант использования:

У меня есть эти маршруты:

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);, но я не знаю, как получить правильный экземпляр контроллера (и/или создать экземпляр контроллера для каждого из FieldViews.

Я совсем потерялся прямо здесь. Я пытаюсь сделать «встроенную версию» без изменения всего представления, и это не кажется хорошей документацией/учебниками о наличии набора представлений, каждое из которых имеет независимый outlet...

Ссылки на всю базу кода и онлайн-версию находятся вверху страницы.


person midu    schedule 03.10.2012    source источник


Ответы (1)


Вероятно, вы ищете {{control}} помощник, который находится в разработке, но доступен в Ember.js исходный код. Этот помощник устроен так, что он создает экземпляр контроллера для каждого использования этого помощника.

person Myslik    schedule 23.04.2013