Статьи

Backbone.js — парсинг ответа от сервера


За последние несколько недель я очень подробно изучал Backbone.js и считаю, что это отличная среда, которая помогает вам легко модульно кодировать. На прошлой неделе я писал о
проверке модели в конструкторе , а затем начал изучать
коллекции в Backbone. Объекты Model можно просматривать как строки таблицы, а Collection — как таблицу. Коллекция может объявлять
свойство
модели и указывать, какие данные она будет хранить. Я искал способы, которыми можно заполнить коллекцию, выбирая данные модели с сервера. Один из способов сделать это — попросить
Модель выбрать данные, а затем добавить ответ в
Коллекцию., Другой способ сделать это — получить данные Коллекции непосредственно с сервера, т.е. вместо определения Модели вы создаете Коллекцию, выбирая данные с сервера. Обычно, когда вы отправляете запрос на сервер, данные ответа, по сути, представляют собой набор объектов. В этом случае вам действительно не нужно определять модель.

В коллекции вы можете определить свойство
url ‘ и указать URL, с которого должны быть получены данные. После определения URL-адреса и создания экземпляра Collection вы можете вызвать
fetch для этого экземпляра, чтобы отправить запрос на сервер.
Fetch отправит запрос GET на сервер и дождется ответа. При вызове fetch вы можете указать в качестве аргументов вызова обработчики успеха и ошибок:

var CarCollection = Backbone.Collection.extend({
				
	//Specify REST URL
	url: 'http://localhost:8500/rest/Car/CarService',
	
	initialize: function () {
		this.bind("reset", function (model, options) {
			console.log("Inside event");
			console.log(model);
			
		});
	}	
});

var carCollectionInstance = new CarCollection();
			
carCollectionInstance.fetch({
	success: function(response,xhr) {
		 console.log("Inside success");
		 console.log(response);
	},
	error: function (errorResponse) {
	       console.log(errorResponse)
	}
});

Как вы можете видеть, я определил Collection —  CarCollection и экземпляр этой коллекции — carCollectionInstance . Затем я вызываю fetch для экземпляра, передавая функции success и callback-функции с ошибками . Когда вы вызываете fetch для экземпляра коллекции, он отправляет Ajax-запрос на сервер, используя jQuery $ .ajax () . Поэтому для вас важно включить jQuery на страницу. Указанный мной URL-адрес является URL-адресом ресурса REST на моем сервере ColdFusion. Этот ресурс REST выбирает некоторые записи из базы данных и возвращает данные запроса в формате JSON:

{ «ОПОРЫ»: [ «BRAND», «Модель», «COLOR»], «DATA»: [[ «Форд», «Фига», «RED»], [ «Форд», «Фиеста», «BLACK» ],
[«Honda», «CRV», «GREEN»], [«Honda», «CITY», «WHITE»]]}}

PS Я не включаю код для ресурса ColdFusion REST, который выбирает записи из базы данных. Это выходит за рамки этого поста, однако вы можете сослаться на серию постов, которые я написал на RESTful WebServices в ColdFusion здесь —  http://www.sagarganatra.com/search/label/REST

Ответ JSON содержит два ключи ‘COLUMNS’ и ‘DATA’, но по сути это один объект JSON. Поскольку коллекция модифицируется, сначала вызывается событие сброса, связанное с коллекцией, а затем обработчик успеха:

Внутри события d {length: 1, модели: Array [1], _byId: Object, _byCid: Object, _callbacks: Object} Внутри успеха d {length: 1, модели: Array [1], _byId: Object, _byCid: Object, _callbacks: Object}

Вы можете видеть, что в коллекцию добавлен только один объект модели. В возражении модели содержатся ключи «COLUMN» и «DATA». Это не тот формат, в котором я хотел, чтобы моя коллекция выглядела. Я хотел коллекцию, которая выглядела бы так:

{БРЕНД: «Ford», МОДЕЛЬ: «Фигу», ЦВЕТ: «КРАСНЫЙ»} {БРЕНД: «Honda», МОДЕЛЬ: «CRV», ЦВЕТ: «ЗЕЛЕНЫЙ»} ….

Прочитав документацию Backbone, я наткнулся на свойство parse, которое можно определить в Collection. Когда синтаксический анализ определен, ответ выборки сначала передается этой функции, а затем вызываются обработчики событий сброса и успеха. При разборе вы можете изменить коллекцию в соответствии с вашими потребностями, и очень важно вернуть данные из этой функции:

(function () {
	
	//Create a Car Collection
	var CarCollection = Backbone.Collection.extend({
		
		//Specify REST URL
		url: 'http://localhost:8500/rest/Car/CarService',
		
		//Parse the response
		parse: function (response) {
			
			console.log("Inside Parse");
			
			//keys
			var keys = response.COLUMNS;
			
			//values
			var values = response.DATA;
						
			//Parse the response and construct models			
			for (var i = 0, length = values.length; i < length; i++) {
				
				var currentValues = values[i];
				var carObject = {};
				for (var j = 0, valuesLength = currentValues.length; j < valuesLength; j++) {
					carObject[keys[j]] = currentValues[j];
				}
				
				//push the model object
				this.push(carObject);	
			}
			
			console.log(this.toJSON());
			
			//return models
			return this.models;
	
		},
		
		initialize: function () {
			this.bind("reset", function (model, options) {
				console.log("Inside event");
				console.log(model);
				
			});
		}
		
	});
	
	
	var carCollectionInstance = new CarCollection();
	
	carCollectionInstance.fetch({
		success: function(response,xhr) {
			console.log("Inside success");
			console.log(response);
		},
		error: function (errorResponse) {
			console.log(errorResponse)
		}
	});
	
})();

Оператор return в функции синтаксического анализа очень важен, потому что, если он отсутствует, он приведет к пустой коллекции. Теперь, когда я регистрирую вывод, я вижу, что коллекция содержит Модели в нужном формате. Кроме того, вы увидите, что в коллекции есть четыре модели в обработчиках сброса и успеха.