我想從單元編輯的網格內的組合框中的服務器接收到的JSON顯示屬性。當用戶選擇一個選項時,我想顯示相同的屬性,但是當用戶保存網格時,我希望將完整的JSON發送到服務器(不僅僅是顯示值或ID字段)。如何使用CellEditing插件在網格內顯示組合框中的屬性並在ExtJS 4.2中保存完整的JSON 4.2
這是我迄今爲止(點擊此處下載http://jsfiddle.net/apater39/do0xg4r1/):
Ext.define('NS.model.State', {
extend: 'Ext.data.Model',
fields: [{
name: 'id',
type: 'int'
}, {
name: 'name',
type: 'string'
}]
});
Ext.define('NS.store.State', {
extend: 'Ext.data.Store',
model: 'NS.model.State',
data: [{
"id": 1,
"name": "Alabama"
}, {
"id": 2,
"name": "Alaska"
}, {
"id": 3,
"name": "Arizona"
}]
});
Ext.define('NS.model.Person', {
extend: 'Ext.data.Model',
fields: [{
name: 'id',
type: 'int'
}, {
name: 'firstName',
type: 'string'
}, {
name: 'state',
type: 'NS.model.State'
}]
});
Ext.define('NS.store.Grid', {
extend: 'Ext.data.Store',
model: 'NS.model.Person',
data: {
'items': [{
'id': 1,
"firstName": "Lisa",
"state": null
}, {
'id': 2,
"firstName": "Bart",
"state": null
}, {
'id': 3,
"firstName": "Homer",
"state": null
}, {
'id': 4,
"firstName": "Marge",
"state": null
}]
},
proxy: {
type: 'memory',
reader: {
type: 'json',
root: 'items'
}
}
});
Ext.create('Ext.grid.Panel', {
title: 'Simpsons',
store: Ext.create('NS.store.Grid'),
columns: [{
header: 'First Name',
dataIndex: 'firstName',
flex: 1,
editor: 'textfield'
}, {
header: 'State',
dataIndex: 'state',
flex: 1,
editor: {
xtype: 'combobox',
store: Ext.create('NS.store.State'),
queryMode: 'local',
displayField: 'name',
valueField: 'id'
}
}],
selType: 'cellmodel',
plugins: [{
ptype: 'cellediting',
clicksToEdit: 2
}],
height: 150,
width: 200,
renderTo: Ext.getBody()
});
如果我使用valueField「身份證」,那麼當用戶從顯示的ID組合框(而不是displayField選擇一個選項)。
,我想發送的JSON是這樣的:
{
"id": 1,
"firstName": "Lisa",
"state":
{
"id": 1,
"name": "Alabama"
}
}
感謝您的幫助。
更新:根據豪爾赫·拉蒙的建議
,我來到了一個解決方案(見http://jsfiddle.net/apater39/8opsqg5s/)。重要的是要聽取cellediting pluging的編輯事件,然後找到選定的組合記錄並設置相應的屬性。
var gridPanel = Ext.create('Ext.grid.Panel', {
title: 'Simpsons',
store: gridStore,
columns: [{
header: 'First Name',
dataIndex: 'firstName',
flex: 1,
editor: 'textfield'
}, {
header: 'State',
dataIndex: 'state',
flex: 1,
editor: {
xtype: 'combobox',
store: Ext.create('NS.store.State'),
displayField: 'name',
valueField: 'name',
editable: false,
queryMode: 'local',
forceSelection: true,
triggerAction: 'all',
selectOnFocus: true,
allowBlank: false
},
renderer: function(value) {
return value.name;
}
}],
selType: 'cellmodel',
plugins: [{
ptype: 'cellediting',
clicksToEdit: 2,
listeners: {
edit: function(editor, ctx, eOpts) {
var vendorColIdx = 1;
if (vendorColIdx === ctx.colIdx) {
var combo = ctx.grid.columns[vendorColIdx].getEditor(ctx.record);
var vendorRecord = combo.findRecord('name', ctx.record.get('state'));
ctx.record.set('state', vendorRecord.data);
}
ctx.grid.getStore().sync();
}
}
}],
height: 250,
width: 200,
renderTo: Ext.getBody()
});
的JSON發送變爲:
{"id":1,"firstName":"Lisa","state":{"id":2,"name":"Alaska"}}
如果我理解你的需求是正確的,你的問題是當保存請求發送到服務器時,它只發送更改而不是完整的模型,是嗎? – Psycho
嗨,那正是我的問題。在服務器端,我有一個JSON在Spring中的表示形式(一個JSON bean),它用於get和save操作。因此,如果網頁只發送ID,則請求將不符合預期的格式。如果至少web可以發送像{id:1}這樣的對象作爲組合框值,它將會工作。 –