AJAX в ExtJS 4

Получение данных в формате JSON

Сегодня наверное уже сложно представить веб-программирование без такой технологии как AJAX. AJAX представляет собой технологию асинхронной передачи данных, без которой не обходится не одно крупной приложение.

В Ext JS для работы с AJAX имеется класс Ext.Ajax. Он является наследником класса Ext.data.Connection и реализует функцию асинхронных запросов с помощью объекта в javascript XMLHttpRequest.

Чтобы отправить AJAX-запрос на сервер, надо задействовать метод request:

Ext.Ajax.request({
    url: 'ajaxData.json'
});

Параметр url указывает на ресурс, к которому мы осуществляем запрос. Это может быть страница php, aspx, данные в формате json или xml.

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

Однако запрос по каким-то причинам может завершится неудачей, например, сервер возвратил нам ошибку 404 или 500, в этом случае для обработки данной ситуации мы можем использовать параметр failure, который также принимает в качестве значения функцию обработки:

Ext.Ajax.request({
		url: 'ajaxData.json',
		success: function(response, options){

		},
		failure: function(response, options){

		}
	});	

Обе этих функции принимают два параметра: response - объект XMLHttpRequest, который содержит данные ответа, и необязательный параметр options, который содержит дополнительные данные о запросе.

Используя параметр response мы и получаем ответ с сервера: var text = response.responseText;

Еще одним способом обработать ответ с сервера представляет функция параметра callback:

Ext.Ajax.request({
		url: 'ajaxData.json',
		callback: function(options, success, response){

        },
	});	

Как и две предыдущих функции эта функция имеет те же параметры options и response. А также параметр success, который позволяет проверить, был ли удачен запрос.

Получение данных в формате JSON

Поскольку одной из наиболее популярных форматов взаимодействия с сервером является JSON, создадим в этом формате на сервере файл ajaxData.json:

{
	"id": 1,
	"firstname": "Bill",
	"lastname": "Gates",
	"company": "Microsoft"
}

Положим файл ajaxData.json в один каталог с нашей веб-страницей, в который будет прописан следующий код:

Ext.onReady(function(){
    Ext.Ajax.request({
		url: 'ajaxData.json',
		success: function(response, options){
			alert(response.responseText);
		},
		failure: function(response, options){
			alert("Ошибка: " + response.statusText);
		}
	});	
});

И если все сделано правильно, то после выполнения запроса мы можем увидеть полученные данные с сервера:

Получение данных с сервера в ExtJS

Получив данные с сервера, мы можем оперировать ими по своему усмотрению, например, выводить на панель, в окне сообщения или что-то еще делать. Однако в данном случае при простом получении ответа в формате JSON нам довольно сложно оперировать данными. Почему бы их не декодировать в объект с соответствующими свойствами?

Декодирование данных JSON

ExtJS имеет встроенные средства декодирования ответа JSON в виде метода Ext.decode. Декодируем данные и загрузим их в соответствующие поля на форме:

Ext.onReady(function(){
    Ext.Ajax.request({
		url: 'ajaxData.json',
		success: function(response, options){
			var objAjax = Ext.decode(response.responseText); // декодируем полученные json-объекты
			// устанавливаем для каждого свойства декодированное значение
			panel.getComponent('txtName').setValue(objAjax.firstname);
			panel.getComponent('txtSurname').setValue(objAjax.lastname);
			panel.getComponent('txtCompany').setValue(objAjax.company);
		},
		failure: function(response, options){
			alert("Ошибка: " + response.statusText);
		}
	});	

	var panel=Ext.create('Ext.panel.Panel', {
        title:'Приложение ExtJS 4',
        width: 300,
        height: 150,
        padding:10,
		bodyPadding:5,
        items : [{
            xtype: 'textfield',
			fieldLabel: 'Имя',
            id: 'txtName',
            height: 20,
         },{
            xtype: 'textfield',
			fieldLabel: 'Фамилия',
            id: 'txtSurname',
            height: 20,
         },{
            xtype: 'textfield',
			fieldLabel: 'Компания',
            id: 'txtCompany',
            height: 20,
         }],
        renderTo: Ext.getBody()
    });
});
Декодирование данных JSON в ExtJS

Подобным образом мы можем получать и более иерархически сложные данные. Например, изменим иерархию файла ajaxData.json следующим образом:

{
	"id": 1,
	"firstname": "Bill",
	"lastname": "Gates",
	"products": ["Windows", "Visual Studio"],
	"company": {
		"name": "Microsoft",
		"director":"Balmer"
	}
}

Тогда получить доступ к более сложным данным мы можем, получая всю цепочку сложений от корня до конечного свойства

Ext.onReady(function(){
	Ext.Ajax.request({
		url: 'ajaxData.json',
		success: function(response, options){
			var objAjax = Ext.decode(response.responseText); // декодируем полученные json-объекты
			console.log(objAjax.firstname); // здесь мы получим Bill
			console.log(objAjax.company.director); // Balmer
			console.log(objAjax.products[1]); // Visual Studio, так как products содержит массив
											 // обращаемся к нему как к массиву
		},
		failure: function(response, options){
			console.log('Запрос не удалось выполнить.');
		}
	});	
});
    Поддержать сайт на родительском проекте КГБ