#javascript #backbone.js
#javascript #backbone.js
Вопрос:
Я разрабатываю одностраничное приложение в backbone.js для сбора пользовательского ввода используется множество html-форм. Чтобы сэкономить время на кодирование, я хотел бы иметь модель / коллекцию полей формы, аналогичную полям формы Django
Мои требования:
- декларативная спецификация элементов формы и их поведения (например, требуемое значение true / false, события, …)
- представления / шаблоны по умолчанию для всех полей формы (но переопределяемые с помощью конфигурации)
- все поля, принадлежащие форме, должны храниться в одной магистрали.Коллекция для упрощения поиска полей
- проверка всей формы или отдельных элементов
Вот как может выглядеть моя простая реализация поля формы:
FormField = Backbone.Model.extend({
initialize: function (attributes, options){
//TODO: initialize form field according to type,
// i.e. set up correct view, validation etc.
}
defaults: {
type: "TextField",
label: "Unknown Label",
required: false,
}
});
FormFields = Backbone.Collection.extend({model: FormField})
MyPlugin = new PluginModel({
//TODO: render a form with these config options within the edit view of the PluginModel
config: FormFields([
{type: "TextField", id:"store_name", label: "Name of Store", required: true},
{type: "SelectField", id:"store_type", label: "Type of Store", required: true, choices: ['local','http']},
]),
//runs after user "submits" form
run: function (){
if this.config.isValid(){
}
}
});
Однако я столкнулся со следующими проблемами:
Backbone.Collection
В A могут размещаться только модели того же типа. Каков наилучший способ хранения разных полей формы в одной коллекции? (Мой подход заключается в использовании только одногоFormField
класса, все дифференцирование происходит на основе типа formfield в методе initialize (), но мне это кажется немного запутанным)- Как я могу настроить правильное представление для каждого экземпляра FormField?
Ответ №1:
На самом деле не найдено использования model для определения элементов пользовательского интерфейса…
Оставьте свою модель чистой. Только данные, которые входят в ваше приложение и выходят из него через ваш сервер. Ваша проверка выполняется в вашей модели (метод проверки см. в документации backbone). Ваша модель содержит все поля, которые будут отображаться в вашем представлении.
Теперь вам нужна информация об этих полях (то, что вы называете formFields). Им не обязательно быть базовой моделью, и их не нужно вставлять в базовую коллекцию. Достаточно простого объекта javascript и массива. Добавляйте эту информацию в свою модель по мере ее расширения (массив описаний полей).
Создайте экземпляр вашего общего вида формы из вашей модели и создайте форму, используя описания полей. Прослушайте события изменения входных данных, выделений, текстовых полей и обновите свою модель. Если обнаруживается ошибка проверки, в модели будет запущено событие «ошибка», и вы сможете отреагировать на свое представление (показать ошибку).
Комментарии:
1. Не поймите меня неправильно… Я просто хотел следовать принципу DRY в своей модели FormField. Создание / проверка / сериализация формы — это сквозная задача в моем приложении … многим различным моделям нужна эта функциональность, поэтому я подумал, что это лучший способ ее реализовать. О коллекции formfield: Мне нужен способ удобного доступа к сериализованным значениям полей формы в моей модели, например,
form.get('field_id').get('value')
и базовая коллекция казалась идеальной для этого.2. То же самое относится и к объекту javascript: form.field_name.value … Если вам не нужно создавать события из базовой коллекции и модели, это излишне.
Ответ №2:
Я портировал библиотеку форм Django на JavaScript как newforms — на данный момент это довольно прямой порт, который может создавать поля формы как элементы DOM или HTML, но пока не выполняет никакой привязки к DOM или событиям.
Я не знаком с Backbone.js но если это облегчает задачу, мне было бы интересно услышать о том, как это делается. Я бы предпочел предоставить полезные помощники, которые позволяют людям настраивать привязку по своему усмотрению, а не навязывать определенный шаблон использования и изобретать кучу колес в процессе.
Ответ №3:
Вы можете попробовать с backbone-forms.js https://github.com/powmedia/backbone-forms