EmberJS - общий доступ к контроллеру / шаблону для разных маршрутов

У меня есть очень простое приложение CRUD, которое позволяет создавать новые объекты, а также редактировать их.

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

Они используют одинаковые элементы формы. Разница лишь в названии и кнопке под формой (которая должна либо обновить, либо создать запись)

В моей реализации у меня есть

2 определения маршрута2 объекта маршрута2 объекта контроллера2 шаблона

Мне было интересно, если

Я не могу продвигать повторное использование здесьесли все эти объекты требуются.

Что меня беспокоит:

У меня есть 2 отдельных шаблона для создания и редактирования (пока они практически идентичны)У меня есть 2 отдельных контроллера, которые делают одно и то же.

Я надеялся решить это на уровне контроллера. Поскольку контроллер украшает модель, в моем случае 1 единственный объект контроллера может обернуть новую запись или существующую запись. Затем он может предоставить свойство (isNewObject), чтобы шаблон мог решить, находимся ли мы в потоке «новый» или «редактировать». Контроллер может иметь единственный метод createOrUpdate, который работает как вnew и вupdate сценарий.

Маршруты

Текущая реализация использует новый и редактируемый маршрут для моего ресурса.

this.resource("locations", function(){
  this.route("new", {path:"/new"});
  this.route("edit", {path: "/:location_id" });
});
Новый маршрут

new route отвечает за создание новой записи и вызывается, когда пользователь переходит к экрану новой записи.

App.LocationsNewRoute = Ember.Route.extend({
  model: function() {
    return App.Location.createRecord();
  }
});
Редактировать маршрут

edit route отвечает за редактирование существующего объекта, когда пользователь нажимает кнопку редактирования на обзорном экране. Я не расширил маршрут редактирования по умолчанию, но вместо этого я использую автоматически сгенерированный маршрут.

Контроллеры

new а такжеedit контроллеры отвечают за обработку действий, которые происходят в шаблоне (сохранение или обновление записи)

Единственное, что делают оба контроллера, это фиксируют транзакцию.

Примечание: Я предполагаю, что это кандидат для повторного использования, но как я могу использовать один контроллер для управления двумя различными маршрутами / шаблонами?

App.LocationsNewController = Ember.ObjectController.extend({
  addItem: function(location) {
    location.transaction.commit();
    this.get("target").transitionTo("locations");
  }
});

App.LocationsEditController = Ember.ObjectController.extend({
  updateItem: function(location) {
    location.transaction.commit();
    this.get("target").transitionTo("locations");
  }
});
Шаблоны:

Как видите, единственное повторное использование кода, которое я имею здесь, это частичное (привязка поля модели). У меня еще есть 2 контроллера (новый и редактировать) и 2 шаблона.

Новые шаблоны устанавливают правильный заголовок / кнопку и повторно используют частичную форму.

<script type="text/x-handlebars" data-template-name="locations/new" >
    <h1>New location</h1>
    {{partial "locationForm"}}
    <p><button {{action addItem this}}>Add record</button></p>
</script>

Шаблоны редактирования устанавливают правильный заголовок / кнопку и повторно используют частичную форму.

<script type="text/x-handlebars" data-template-name="locations/edit" >
    <h1>Edit location</h1>
    {{partial "locationForm"}}
    <p><button {{action updateItem this}}>Update record</button></p>
</script>

Частичное

<script type="text/x-handlebars" data-template-name="_locationForm" >
  <form class="form-horizontal">
  <div class="control-group">
    <label class="control-label" for="latitude">Latitude</label>
    <div class="controls">
      {{view Ember.TextField valueBinding="latitude"}}
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="latitude">Longitude</label>
    <div class="controls">
      {{view Ember.TextField valueBinding="longitude"}}
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="accuracy">Accuracy</label>
    <div class="controls">
      {{view Ember.TextField valueBinding="accuracy"}}
    </div>
  </div>
</form>
</script>

Примечание: Я ожидаю, что я могу сделать что-то эффективное / умнее здесь.

Я хотел бы, чтобы мой шаблон выглядел следующим образом: (получение заголовка от контроллера и выполнение одного действия, которое обрабатывает как обновление, так и создание)

<script type="text/x-handlebars" data-template-name="locations" >
    <h1>{{title}}</h1>
    {{partial "locationForm"}}
    <p><button {{action createOrUpdateItem this}}>Add record</button></p>
</script>
Вопрос

Могу ли я переделать этот код, чтобы иметь больше повторного использования кода, или это плохая идея, пытаться сделать это с одним шаблоном и одним контроллером для потоков «редактирования записи» и «новой записи». Если так, как это можно сделать? Мне не хватает той части, где мои 2 маршрута (создание и редактирование) будут использовать один и тот же контроллер / шаблон.

Ответы на вопрос(2)

Ваш ответ на вопрос