我有一个使用单元格编辑插件的网格面板。在此网格旁边有一组链接,表示可以插入到单元格中的可用占位符。
目标:当用户编辑单元格并单击其中一个链接时,应在用户光标的位置插入相应的占位符。
到目前为止我发现了什么:
- 在编辑时,然后我单击一个链接,单元格中的输入元素失去焦点并且编辑停止。似乎输入元素已从 dom 中删除。
- 要获得光标位置,我需要掌握输入元素(链接)。CellEditing 插件上有 4 个事件:beforeedit、cancelledit、edit 和 validateedit。在显示输入元素时,它们都不会被触发。
- 有一种方法 Ext.grid.plugin.CellEditingView.startEditByPosition 但我认为这只会选择应该编辑的单元格。
请问有什么帮助吗?
编辑
我坚持实施以下回调。
// var placeholder =
// ...
listeners: {
itemclick: function(view, link) {
console.debug('selected placeholder: ', link.data.placeholder)
console.debug(exampleGrid);
// Todo: insert placeholder into the grid cell at the cursor position
}
}
编辑 2
好的,感谢@Chris,我让它工作了。这是 JsFiddle 上的代码
解决方案是使用覆盖普通 TextField 的 CustomEditor(准确地说是 Picker):
Ext.define('CustomEditorField', {
extend: 'Ext.form.field.Picker',
alias: 'widget.customeditorfield',
// ...
createPicker: function() {
var me = this,
format = Ext.String.format;
return Ext.create('Ext.form.Panel', {
// ...
items: [
{
xtype: 'textfield',
name: 'description'
}, Ext.create('Ext.view.View', {
listeners: {
itemclick: function(view, link) {
var textToInsert = link.data.placeholder,
textInField = me.picker.getForm().getValues()['description'],
position = me.picker.getEl().query('input')[0].selectionStart;
var changedText = textInField.substring(0, position) +
textToInsert + textInField.substring(position);
me.picker.getForm().setValues({description: changedText});
return false;
}
},
store: {
fields: ['placeholder', 'text'],
data: [
{placeholder: '{param1}', text: 'Parameter 1'},
{placeholder: '{param2}', text: 'Parameter 2'}
]
},
itemSelector: 'a',
tpl: [
'<tpl for=".">',
'<a href="#" data-placeholder="{placeholder}">{text}</a><br />',
'</tpl>'
]
})
],
listeners: {
afterrender: function(panel, opts) {
panel.getForm().setValues({description: me.getValue()});
}
}
});
}