Главная

Webmacter V.2 Всё для вебмастера » Уроки по JS » Backbone.js 27 – Менеджер контактов. Добавление контактов

Backbone.js 27 – Менеджер контактов. Добавление контактов

Backbone.js 27 – Менеджер контактов. Добавление контактов


В этом посте, мы подробно разберем процесс написания функционала добавления контактов.




*Изменения контроллера пропущенные в видео, описаны далее в статье

Приветствую! Начнем с верстки. Сверстаем форму, через которую мы будем добавлять наши контакты:
	<form id="addContact">
		<div>
			<label for="first_name">Имя: </label>
			<input type="text" id="first_name" name="first_name">
		</div>
		<div>
			<label for="last_name">Фамилия: </label>
			<input type="text" id="last_name" name="last_name">
		</div>
		<div>
			<label for="email_address">Email: </label>
			<input type="text" id="email_address" name="email_address">
		</div>
		<div>
			<label for="description">Описание: </label>
			<textarea id="description" name="description"></textarea>
		</div>
		<div>
			<input type="submit" value="Добавить контакт">
		</div>
	</form>	

И сразу напишем вид, отвечающий за добавление контакта и в нем – соответствующее событие addContact:
/*
|---------------------------------------------------
| Add Contact View
|---------------------------------------------------
*/

App.Views.AddContact = Backbone.View.extend({
	el: '#addContact',

	events: {
		'submit' : 'addContact'
	},

	addContact: function(e) {
		e.preventDefault();

		console.log( 'add contact now' );
	}
});

После чего, в инициализации главного вида App, создаем экземпляр вида, передавая в него коллекцию контактов:
App.Views.App = Backbone.View.extend({
	initialize: function() {
		var addContactView = new App.Views.AddContact({ collection: App.contacts });
	}
});

Вернемся к виду и допишем событие addContact. При клике на кнопку “Добавить контакт”, в коллекции будет создаваться новая модель, с данными которые мы ввели в форму и на сервер будут отправляться те же данные. Для этого мы используем метод create, под капотом которого, запускается метод save:
App.Views.AddContact = Backbone.View.extend({
	el: '#addContact',

	events: {
		'submit' : 'addContact'
	},

	addContact: function(e) {
		e.preventDefault();

		this.collection.create({
			first_name: this.$('#first_name').val(),
			last_name: this.$('#last_name').val(),
			email_address: this.$('#email_address').val(),
			description: this.$('#description').val()
		});

		console.log(this.collection.toJSON());
	}
});

Примем запрос на серверной стороне. Напишем роут, запускающий соответствующий action в контроллере:
Route::post('/contacts', 'contacts@store');

ласс! В базу данных и коллекцию добавился новый контакт, но обратим внимание на одну вещь. В добавленной к коллекции модели нету айдишника. Это потому что он не возвращается с сервера. Для этого надо сделать пару изменений. Сначала, допишем объект-параметр { wait: true } для метода create. Этот параметр указывает, чтобы в коллекцию не добавлялась новая модель, пока не придет ответ с сервера:
this.collection.create({
	first_name: this.$('#first_name').val(),
	last_name: this.$('#last_name').val(),
	email_address: this.$('#email_address').val(),
	description: this.$('#description').val()
}, { wait: true });

Так же на серверной стороне, нам надо возвращать модель с айдишником, который автоматически генериться в БД. Id нам необходим. Без него события (которые нам понадобятся позже) коллекции не будут срабатывать, так как она не будет понимать, какая модель была добавлена. Поэтому изменим action_store нашего серверного контроллера:
	public function action_store()
    {
        $input = Input::json();

        Contact::create(array(
            'first_name' => $input->first_name,
            'last_name' => $input->last_name,
            'email_address' => $input->email_address,
            'description' => $input->description
        ));

        $id = Contact::where('email_address', '=', $input->email_address )->only('id');

        $returnArr = array(
            'id' => $id,
            'first_name' => $input->first_name,
            'last_name' => $input->last_name,
            'email_address' => $input->email_address,
            'description' => $input->description
        );

        return json_encode($returnArr);
    }    

Отлично, новый контакт добавляется в базу данных. Но есть одно но. Можно добавить пустой контакт. Надо это исправить. Для этого у нашей модели, есть специальный метод validate. Отвалидируем имя, фамилию и email:
App.Models.Contact = Backbone.Model.extend({
//validate
validate: function(attrs) {
if( ! attrs.first_name || ! attrs.last_name ) {
return ‘Имя и фамилия обязательны для заполнения!';
}

if( ! attrs.email_address ) {
return ‘Пожалуйста введите валидный Email.';
}
}
});

Теперь добавить контакт с незаполненными именем и фамилией, а так же пустым email – не получится. Проверим это в браузере:
		var newContact = this.collection.create({
							first_name: this.$('#first_name').val(),
							last_name: this.$('#last_name').val(),
							email_address: this.$('#email_address').val(),
							description: this.$('#description').val()
						}, { wait: true });

		console.log(  newContact );

На этом сегодня все. Всем спасибо и успехов в разработке!

Источник:loftblog
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.