Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Проблема с выводом xml в грид (https://javascript.ru/forum/extjs/29143-problema-s-vyvodom-xml-v-grid.html)

WalterScott 16.06.2012 23:43

Проблема с выводом xml в грид
 
Делаю по этому примеру: http://deloy-dev.com/extJS_4.0/ext-4...ml-grid_1.html

Ext.require([
    'Ext.data.*',
    'Ext.grid.*'
]);
Ext.application({

	name: 'name',
	launch: function() {
		Ext.define('Contacts',{
			extend: 'Ext.data.Model',
			fields: [
				'id','mail','name'
			]
		});
		var store = Ext.create('Ext.data.Store', {
			model: 'Contacts',
			autoLoad: true,
			proxy: {
				type: 'ajax',
				url: 'http://localhost:8080/jersey/rest/contacts/',
				reader: {
					type: 'xml',
					record: 'contact',
					idProperty: 'id'
				}
			}
		});
		var xmlGrid = Ext.create('Ext.grid.Panel', {
			store: store,
			columns: [
				{text: "id",width:50, dataIndex: 'id', sortable: true},
				{text: "mail",flex:1, dataIndex: 'mail', sortable: true},
				{text: "name", width: 125, dataIndex: 'name', sortable: true}
			],
			renderTo: Ext.getBody(),
			width: 550,
			height: 200
		});
	}
});


В результате выводится пустой грид. xml по урл http://localhost:8080/jersey/rest/contacts/ в браузер выдаётся.
Интересный момент: если в firebug посмотреть переменную store -свойство proxy - свойство reader, то видно следующее: Object { type="json", superclass={...}, config={...}, ещё...}

Тип данных определён как json. Похоже на то, что причина в этом. Как это исправить?

nekto_O 17.06.2012 21:52

Ну, сложно сказать в чем проблема, не зная какой xml в ответе приходит. Насколько я понял вы используете rest-сервис. Укажите тогда type: 'rest' у proxy. Конечно проблема скорее всего не в этом, возможно вы неверно указали record или требуется указать root (в зависимости от структуры данных).
Цитата:

Сообщение от WalterScott
Интересный момент: если в firebug посмотреть переменную store -свойство proxy - свойство reader, то видно следующее: Object { type="json", superclass={...}, config={...}, ещё...}

Добавьте после определения store(после 27-й строки) строку
alert(store.getProxy().getReader().type);

и проверьте.

WalterScott 18.06.2012 22:23

Кстати, в IE работает. И с type="rest" и c type="ajax". Не работает в FF и Хроме. Ну, хром это вообще отдельная история...

xml такой:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contacts>
<contact>
<id>1</id>
<mail>ivan@mail.ru</mail>
<name>Ivanov</name>
</contact>
<contact>
<id>2</id>
<mail>peter@mail.ru</mail>
<name>Petrov</name>
</contact>
</contacts>


store.getProxy().getReader().type и в Firefox, и в IE возвращает xml.

Указание root в Firefox не помогло, а в IE вызвало странный эффект - стала отображаться только одна запись из xml.

nekto_O 19.06.2012 09:07

Проверил в FF. указал свойства:
у прокси
type: 'rest'

у ридера:
type: 'xml',
record: 'contact',
root: 'contacts',
idProperty: 'id'

Не вижу проблем, все отлично работает.

WalterScott 19.06.2012 21:37

Гм, мне сейчас пришла в голову светлая мысль - поместить папку с ExtJS-страницей на tomcat, на котором работает restful-сервис. И обращаться к ней, соответственно, через http://localhost:8080/
И всё заработало, во всех браузерах.
До этого они находились, вроде как на разных хостах. Но это вроде не должно смущать, раз уж мы к веб-сервису обращаемся?

nekto_O 20.06.2012 01:01

Цитата:

Сообщение от WalterScott
Но это вроде не должно смущать, раз уж мы к веб-сервису обращаемся?

Это как раз-таки принципиально, взгляните на иерархию -> http://docs.sencha.com/ext-js/4-0/#!...ata.proxy.Rest. В обоих случаях используется XHR, а насколько я знаю, для того чтобы обработать ответ из внешнего сервиса последний должен отдавать заголовок Access-Control-Allow-Origin: domain.com, где domain.com - адрес домена с которого отправляется запрос. Тоесть примерно так, если не ошибаюсь:
request.setHeader("Access-Control-Allow-Origin", "domain.com");


Часовой пояс GMT +3, время: 16:43.