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 маршрута (создание и редактирование) будут использовать один и тот же контроллер / шаблон.