PDA

View Full Version : Store + ItemSelector dont save changes.



Forn
4 Apr 2012, 10:19 AM
Hello to All.

The action: btnSaveChanges_onClick is executed, but the post method send only id=0 name='' and thats all. But in my second multipleselect I was added some values.

I have the next code:


var baseUrl = 'http://xxxxx/index-extjs.php';
var selectedCustomerId = "";


Ext.Loader.setConfig({
enabled: true
});
Ext.Loader.setPath('Ext.ux', 'extjs/ux');
Ext.require([
'Ext.form.Panel',
'Ext.ux.form.MultiSelect',
'Ext.ux.form.ItemSelector'
]);

/**
* Модель для хранения инфомрации о клиентах.
*/
Ext.define('CustomersModels', {
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'}
]
});

/**
* Поиск клиента
*/
var customersStore = Ext.create('Ext.data.Store', {
pageSize: 10,
model: 'CustomersModels',
proxy: {
type: 'ajax',
url : baseUrl+'?ds=customers',
reader: {
type: 'json'
}
},
});

/**
* Для поиска доступных связей.
*/
var storeAvailableCustomers = Ext.create('Ext.data.Store', {
model: 'CustomersModels',
proxy: {
type: 'ajax',
url : baseUrl+'?ds=availablecustomers',
reader: {
type: 'json'
}
},
});

/**
* Для поиска существующих связей.
*/
var storeAssignedCustomers = Ext.create('Ext.data.Store', {
model: 'CustomersModels',
proxy: {
type: 'ajax',
url : baseUrl+'?ds=assignedcustomers',
reader: {
type: 'json'
},
writer: {
type: 'json'
}
},
});

/**
* При выборе клиента для редактирования.
* @param combo
* @param records
* @param eOpts
*/
function cbEditClient_onSelect(combo, records, eOpts){
selectedCustomerId = records[0]['id'];
Ext.getCmp('txtSearchString').setDisabled(false);
Ext.getCmp('btnSaveChanges').setDisabled(false);
}

/**
* При вводе строки поиска для связей.
* @param combo
* @param records
* @param eOpts
*/
function customersLinkStore_onSelect(combo, records, eOpts){
var selectedItem = records[0]['id'];
}

function txtSearchString_onChange(field, newValue, oldValue, eOpts){
if (newValue.length>=4){
//Надо отправить запрос на сервер.
searchString = newValue;
storeAvailableCustomers.load({
params: {
query: searchString,
selectedCustomerId: selectedCustomerId,
getall: 1
},
scope : this,
callback: function(records, operation, success) {
Ext.getCmp('availableCustomers').bindStore(storeAvailableCustomers);
}
});

storeAssignedCustomers.load({
params: {
query: searchString,
selectedCustomerId: selectedCustomerId,
getall: 1
},
scope : this,
callback: function(records, operation, success) {
Ext.getCmp('assignedCustomers').bindStore(storeAssignedCustomers);
}
});
}
}

/**
* Сохраняет данные.
* @param button
* @param event
* @param eOpts
*/
function btnSaveChanges_onClick(button, event, eOpts ){
Ext.getCmp('assignedCustomers').store.sync();
Ext.MessageBox.alert('Сообщение', 'Ваши изменения внесены в базу данных.');
}

/**
* код самого приложения.
*/
Ext.application({
name: 'SalesEtersoft-Bug8336',
appFolder: 'app',

launch: function() {
Ext.create('Ext.container.Viewport', {
layout: 'border',
items: [
{
xtype: 'panel',
itemId: 'panelRoot',
layout: {
type: 'border'
},
title: 'Управление соответствиями клиентов',
region: 'center',
dockedItems: [
{
xtype: 'toolbar',
id: 'mainToolbar',
region: 'center',
dock: 'top'
},
{
xtype: 'toolbar',
id: 'statusBar',
width: 150,
region: 'east',
dock: 'bottom',
items: [
{
xtype: 'label',
height: 18,
html: '<b>Все права защищены ООО "Этерсофт" 2012</b>',
id: 'lbCopyright',
width: 419,
text: ''
}
]
}
],
items: [
{
xtype: 'panel',
id: 'panelMain',
title: '',
region: 'center',
items: [
{
xtype: 'form',
id: 'formSelectClient',
bodyPadding: 10,
title: 'Ввод данных:',
items: [
{
xtype: 'combobox',
id: 'cbEditClient',
fieldLabel: 'Выберите клиента для редактирования',
labelAlign: 'top',
anchor: '100%',
store: customersStore,
displayField: 'name',
valueField: 'id',
typeAhead: false,
hideTrigger:true,
listConfig: {
loadingText: 'Выполняется поиск...',
emptyText: 'По заданым критериям клиенты в базе данных не найдены.',
},
listeners:{
'select': cbEditClient_onSelect
}
},
{
xtype: 'component',
style: 'margin-top:10px',
html: 'Поиск осуществляется по первым 4 символам.'
}
]
},
{
xtype: 'form',
name: 'linkForm',
id: 'linkForm',
title: 'Связи:',
items:[
{
xtype: 'textfield',
name: 'txtSearchString',
id: 'txtSearchString',
disabled: true,
labelAlign: 'top',
fieldLabel: 'Введите строку поиска (минимум 4 символа):',
anchor: '100%',
listeners:{
'change': txtSearchString_onChange
}
},
{
xtype: 'itemselector',
name: 'linkSelector',
id: 'linkSelector',
anchor: '100%',
imagePath: 'extjs/ux/images/',
allowBlank: true,
store: storeAvailableCustomers,
buttons : ['add', 'remove'],
msgTarget: 'side',
multiselects: [{
id: 'availableCustomers',
store: storeAvailableCustomers,
displayField: 'name',
valueField: 'id'
},{
id: 'assignedCustomers',
store: storeAssignedCustomers,
displayField: 'name',
valueField: 'id'
}]
},
{
xtype: 'button',
id: 'btnSaveChanges',
text : 'Сохранить изменения',
disabled: true,
anchor: '100%',
listeners:{
'click': btnSaveChanges_onClick
}
}
]
}
]
}
]
}
]
});
}
});

scottmartin
6 Apr 2012, 9:31 AM
Please add idProperty:'id' to your model. (even thought it is the default; good habit to get into)
I see you call to store.sync(), but you need to submit your form



form.getForm().submit({ .. })
// or
record = form.getRecord(),
values = form.getValues(),
if (form.getForm().isValid()) {
record.set(values); // or record.save() that has a callback if needed
}


Regards,
Scott.