Главная

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

Backbone.js 28 – Менеджер контактов. Отображение контактов.

Backbone.js 28 – Менеджер контактов. Отображение контактов.


Сразу к делу! Наш менеджер контактов продолжает расцветать. Сегодня мы напишем отображение контактов на странице и автоматическое обновление html и dom-дерева, при добавлении нового контакта в коллекцию.




Начнем с двух новых видов – вида списка всех контактов и вида единичного контакта. Все это мы уже проходили, поэтому в подробности вдаваться не будем. Единственное новое, в качестве шаблонизатора мы будем использовать handlebars.js:
/*
|---------------------------------------------------
|  All Contacts View
|---------------------------------------------------
*/
App.Views.Contacts = Backbone.View.extend({
	tagName: 'tbody',

	render: function() {
		this.collection.each( this.addOne, this );

		return this;
	},

	addOne: function(contact) {
		var contactView = new App.Views.Contact({ model: contact });
		console.log( contactView.render().el );
		this.$el.append(contactView.render().el);
	}
});

/*
|---------------------------------------------------
| Single Contact View
|---------------------------------------------------
*/

App.Views.Contact = Backbone.View.extend({
	tagName: 'tr',

	template: '',

	render: function() {
		this.$el.html();
	}

});

Подключаем handlebars и пишем шаблон контакта:
	<script id="contactTemplate" type="text/template">
		<td>{{ first_name }}</td>
		<td>{{ last_name }}</td>
		<td>{{ email_address}}</td>
		<td>{{ description }}</td>
	</script>

В main.js напишем вспомогательную функцию компиляции шаблонов:
App.template = function(id) {
	return Handlebars.compile( $('#' + id).html() );
};

Теперь просто передаем в нашу функцию template айдишник шаблона и записываем все это в свойства вида.После чего, в элемент tr нашего вида вставляем сгенерённый шаблон контакта, с данными из модели:
App.Views.Contact = Backbone.View.extend({
	tagName: 'tr',

	template: App.template('contactTemplate'),

	render: function() {
		this.$el.html( this.template( this.model.toJSON() ) );
		return this;
	}

});

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

Верстаем таблицу и вставляем в нее сгенеренный tbody:
	<table id="allContacts">
		<thead>
			<tr>
				<td><strong>Имя</strong></td>
				<td><strong>Фамилия</strong></td>
				<td><strong>Email</strong></td>
				<td><strong>Описание</strong></td>
			</tr>
		</thead>
	</table>

App.Views.App = Backbone.View.extend({
	initialize: function() {
		var addContact = new App.Views.AddContact({ collection: App.contacts });
		var allContactsView = new App.Views.Contacts({ collection: App.contacts }).render();
		$('#allContacts').append( allContactsView.el );
	}
});

Пропишем немного стилей:
#contact-form { margin-bottom: 2em; }

Теперь нужно обновлять таблицу и очищать инпуты. Начнем с очищения инпутов:
App.Views.AddContact = Backbone.View.extend({

	initialize: function() {
		this.first_name	= $('#first_name');
		this.last_name	= $('#last_name');
		this.email_address	= $('#email_address');
		this.description	= $('#description');
	},

	el: '#contact-form',

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

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

		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 });

		this.clearForm();

	},

	clearForm: function() {
		this.first_name.val('');
		this.last_name.val('');
		this.email_address.val('');
		this.description.val('');
	}

});

И напоследок самое интересное. Делаем автоматическое обновление DOM-дерева и рендеринг HTML, при добавлении в коллекцию новой модели. Осуществляется это прослушкой события ‘Add’. Напишем ее в методе всех контактов. Как только, коллекция увеличится на одну модель, тут же сработает метода addOne:
App.Views.Contacts = Backbone.View.extend({
	initialize: function() {
		this.collection.on('add', this.addOne, this);
	},

       ....
});

Классно, не правда ли? До нового видеоурока!

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

Информация

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