Я работал над созданием EditorGridPanel для использования с несколькими адресами, но без особого успеха. Видите ли, дело в том, что клиент хотел бы хранить биты адреса отдельными частями, но в формате стандартного адреса. Таким образом, как общая текстовая область для ввода адреса, так и методы с полностью дискретными полями отсутствуют.
Здесь вступает в игру CompositeField. Я играл с расширением полей Column и Composite, чтобы редактор работал нужным образом. Дошло до того, что он вроде как работает (он отображается, если щелкнуть по нему достаточно), но выдает ошибку «this.ownerCt не определено». По некоторым поискам, я вижу, что это проблема порядка, в котором создаются экземпляры, но я не уверен, как создать экземпляр редактора позже, поддерживая его инкапсуляцию.
Код:
<code>Framework.AddressEditorField = Ext.extend(Ext.form.CompositeField,{
initComponent: function() {
Ext.apply(this,{
items:[
{name:'test',xtype:'textfield',width:50},
{name:'test2',xtype:'textfield',width:50}
]
});
Framework.AddressEditorField.superclass.initComponent.apply(this);
}
});
Framework.AddressEditor = Ext.extend(Ext.grid.Column,{
width:220,
editable:true,
constructor: function(cfg) {
this.editor = new Framework.AddressEditorField();
Framework.AddressEditor.superclass.constructor.call(this, cfg);
this.text="";
if(!this.id){
this.id = Ext.id();
}
this.renderer = this.renderer.createDelegate(this);
},
init : function(grid){
this.grid = grid;
},
renderer : function(v, p, record){
p.css += ' x-grid3-address-col-td';
var template = new Ext.XTemplate("<pre class='{0}'><tpl if='careof!=\"\"'>{careof}\n</tpl>{address1}\n<tpl if='address2!=\"\"'>{address2}\n</tpl>{city}, {state} {zip}<tpl if='country!=\"\">\n{country}</tpl>
")
var t = template.applyTemplate (record.data);
return String.format (t, this.createId ());
},
createId: function () {
return 'x-grid3-cc-' + this.id;
}
});
И соответствующий раздел EditorGridPanel:
{xtype:'fieldset',itemId:'mailGridFieldset',title:'Addresses',items:{
xtype:'editorgrid',
unstyled:true,
itemId:'mailGrid',
hideHeaders:true,
autoHeight:true,
width:450,
clicksToEdit:1,
defaultMailType:'Home',
store:this.addressStore,
border: false,
columns:[
{
editable:true,dataIndex:'address_type',editor:combo,renderer:Ext.util.Format.comboRenderer(combo)
},
new Framework.AddressEditor(),
defaultBoxMailing
],
sm:new Ext.grid.RowSelectionModel()
}}
Я уверен, что на самом деле я делаю это совершенно неправильно, учитывая, что я не нашел много примеров, расширяющих CompositeField или Column. Какие-нибудь мудрые слова?
Спасибо.