// codeart.ru / Теория программирования / Для чего нужен reader и readerError в ExtJS.FormPanel Форум

Для чего нужен reader и readerError в ExtJS.FormPanel rss подписка

Автор: Evgeniy Sergeev

В данной заметке я коротко расскажу о некоторых особенностях работы с элементами FormPanel в ExtJS. В частности расскажу о том для чего нужны поля reader и readerError. В конце статьи приведу несколько полезных примеров использования FormPanel.

Что такое FormPanel

Начну с главного — что такое FormPanel в ExtJS и для чего она нужна. Из названия нетрудно догадаться, что FormPanel — это специальный вид панелей в ExtJS, которая служит для построение HTML форм на странице. Например, нам нужно занести в базу данные пользователя: имя, фамилия, домашний телефон и т.д. Для этого и необходимо использовать форму FormPanel. Но при работе с этой формой нужно знать две особенности.

Что такое XMLReader, JSONReader и т.д.

В ExtJS есть такое понятие как Reader — это базовый интерфейс, который позволяет обрабатывать ответы от сервера. Основной метод этого интерфейс — это read(Response). Ридеры бывают разные: XML, JSON и так далее. Для каждого типа ответа от сервера имеется свой класс Reader-а. Этот класс в ExtJS используется повсеместно, например для построения таблиц, загрузки выпадающих списков и т.д.

Конечно же он используется и в формах (FormPanel), но здесь нужно знать, что в формах есть два поля: reader и errorReader, которые используются несколько по-разному.

Поле reader

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


userForm.addButton('Загрузить данные пользователя', function(){
userForm.getForm().load({url:'xml-form.xml', waitMsg:'Loading'});
});

В результате, когда пользователь нажмет на кнопку «загрузить данные пользователя» ExtJS сформирует AJAX запрос и отправит его на сервер, а когда получит ответ, от передаст его Reader-у, который был указан в поле «reader». Результаты работы ридера будут отображены в соответствующих элементах формы.

Поле errorReader

Поле errorReader используется для того, чтобы обработать результат полученный функцией submit. В отличии от функции load, функция submit служит для того, чтобы отправить элементы формы на сервер. Результат, полученный от сервера, будет обрабатываться ридером, который был указан в поле errorReader:


userForm.addButton({
text: 'Сохранить',
handler: function(){
fs.getForm().submit({url:'xml-errors.xml', waitMsg:'Saving Data...'});
}
});

Как объявляются ридеры в FormPanel

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


reader : new Ext.data.XmlReader({
record : 'contact',
success: '@success'
}, [
{name: 'first', mapping:'name/first'}, // custom mapping
{name: 'last', mapping:'name/last'},
'company', 'email', 'state',
{name: 'dob', type:'date', dateFormat:'m/d/Y'} // custom data types
]),

errorReader: new Ext.form.XmlReader({
record : 'field',
success: '@success'
}, [
'id', 'msg'
]
)

Боевой пример


/*!
* Ext JS Library 3.1.1
* Copyright(c) 2006-2010 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
Ext.onReady(function(){

Ext.QuickTips.init();

// turn on validation errors beside the field globally
Ext.form.Field.prototype.msgTarget = 'side';

var fs = new Ext.FormPanel({
frame: true,
title:'XML Form',
labelAlign: 'right',
labelWidth: 85,
width:340,
waitMsgTarget: true,

// configure how to read the XML Data
reader : new Ext.data.XmlReader({
record : 'contact',
success: '@success'
}, [
{name: 'first', mapping:'name/first'}, // custom mapping
{name: 'last', mapping:'name/last'},
'company', 'email', 'state',
{name: 'dob', type:'date', dateFormat:'m/d/Y'} // custom data types
]),

// reusable eror reader class defined at the end of this file
errorReader: new Ext.form.XmlErrorReader(),

items: [
new Ext.form.FieldSet({
title: 'Contact Information',
autoHeight: true,
defaultType: 'textfield',
items: [{
fieldLabel: 'First Name',
name: 'first',
width:190
}, {
fieldLabel: 'Last Name',
name: 'last',
width:190
}, {
fieldLabel: 'Company',
name: 'company',
width:190
}, {
fieldLabel: 'Email',
name: 'email',
vtype:'email',
width:190
},

new Ext.form.ComboBox({
fieldLabel: 'State',
hiddenName:'state',
store: new Ext.data.ArrayStore({
fields: ['abbr', 'state'],
data : Ext.exampledata.states // from states.js
}),
valueField:'abbr',
displayField:'state',
typeAhead: true,
mode: 'local',
triggerAction: 'all',
emptyText:'Select a state...',
selectOnFocus:true,
width:190
}),

new Ext.form.DateField({
fieldLabel: 'Date of Birth',
name: 'dob',
width:190,
allowBlank:false
})
]
})
]
});

// simple button add
fs.addButton('Load', function(){
fs.getForm().load({url:'xml-form.xml', waitMsg:'Loading'});
});

// explicit add
var submit = fs.addButton({
text: 'Submit',
disabled:true,
handler: function(){
fs.getForm().submit({url:'xml-errors.xml', waitMsg:'Saving Data...'});
}
});

fs.render('form-ct');

fs.on({
actioncomplete: function(form, action){
if(action.type == 'load'){
submit.enable();
}
}
});

});

// A reusable error reader class for XML forms
Ext.form.XmlErrorReader = function(){
Ext.form.XmlErrorReader.superclass.constructor.call(this, {
record : 'field',
success: '@success'
}, [
'id', 'msg'
]
);
};
Ext.extend(Ext.form.XmlErrorReader, Ext.data.XmlReader);

Содержимое xml-forms.xml






Jack
Slocum

Ext JS
support@extjs.com

OH
04/15/2007


Leave a Reply

« »