Асинхронная загрузка данных Backbone.js

в 14:52, , рубрики: backbone.js, javascript, асинхронная загрузка, Веб-разработка, метки: ,

Добрый день! Я продолжу писать статьи о том, что пришлось писать на Backbone.js в ходе работе и с чем вы можете столкнуться. Сегодня речь пойдет про асинхронную загрузку данных, а точнее данных которые часто нам нужны на сайте.

Предположим на сайте можно добавлять разные типы данных (картинка, текст, аудио), но эти типы могут расширяться. Возможные типы хранятся в базе данных. Каждый раз доставать с базы очень накладно. Нам надо один раз достать и использовать.

Так мы загрузим данные:

app.models.dataTypes = new DataTypesCollection();
app.models.dataTypes.fetch();

Теперь в любом месте показываем пользователю app.models.dataTypes.Но у нас возможен один прокол, что если пользователь сразу зайдет на ту страницу, где нам нужно это поле? Для этого создадим событие, что данные получены.

app.models.dataTypes = new DataTypesCollection();
app.models.dataTypes.fetch({
	success: function() {
		Backbone.history.trigger("dataTypesLoaded");
	}
});

Теперь нам нужно «словить» это событие. Для этого я написал функцию loadDataTypes, которая принимает в качестве параметра место, где надо расположить данные (place). Потому что у меня на одной странице нужно отобразить этот блок в нескольких местах. (Добавление и редактирование данных происходит на одной странице).

function loadDataTypes(place) {
	place.empty(); // очищаем место
	var addDataTypes = function() { // функция добавления данных
		_.each(app.models.dataTypes.models, function(item) {
			item.set("value", item.get("data_type_code"));
			item.set("text", item.get("data_type_name"));
			var selectItem = new SelectItemView({ // вид для optionа
				el: place,
				model: item
			});
			selectItem.render(); // выдаем
		});
	}
		
	if (app.models.dataTypes.models.length != 0) { // если загружены
		addDataTypes();
	} else { // еще не загружены, "ловим" событие.
		Backbone.history.on("dataTypesLoaded", addDataTypes); 
	}
}

Таким образом, мы загружаем данные, например при первой загрузке и потом выдаем в нужном месте.

Но если говорить обобщенно, то таких полей у нас может быть большое количество. Для всех полей пишем аналогичные функции и все данные будут загружаться асинхронно с выводом по мере загрузки. Пользователь даже не заметит, как быстро все загрузилось.

С плюсов мы получили то, что данные забираем с сервера только один раз и потом их используем сколько хотим. Тем самым не навредив пользователю.

P.S. Если надо описание SelectItemView, пишите я могу дописать, но там все тривиально.

Автор: ozzycv

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js