我正在爲組合框構建「修復程序」,因爲它在打開行編輯器時顯示值字段而不是文本框中的顯示字段。但是,要做到這一點,我必須在發送到服務器之前更改組合框的值。要做到這一點,我的想法是鉤住行編輯插件的beforeedit事件。從RowEditing組件(本例中爲組合框)獲取RowEditing或Grid
最大的問題是,我無法找到一種方法來達到我正在進行行編輯的網格,或者直接編輯插件。
我唯一能找到的就是組合框與combobox.up('form')
合併的形式,我可以與這些事件掛鉤,但我認爲它們不會「足夠早」發生。我找不到從表單中獲取rowediting插件的方法:\
有關如何解決此問題的任何想法?
編輯1:
按照要求煞,這是顯示爲圖像的問題:
http://dl.dropbox.com/u/762638/Files/Images/Screenshots/show_combobox_extjs_problem/part_1.png
http://dl.dropbox.com/u/762638/Files/Images/Screenshots/show_combobox_extjs_problem/part_2.png
http://dl.dropbox.com/u/762638/Files/Images/Screenshots/show_combobox_extjs_problem/part_3.png
在這裏你可以找到組合框代碼:
Ext.define('Fdd.form.field.XComboBox', {
extend: 'Ext.form.field.ComboBox',
alias: 'widget.xcombobox',
displayField: 'display',
queryMode: 'local',
valueField: 'value',
//forceSelection: true,
/**
*
* @property {Ext.form.Panel} parentForm
* Contains a reference to the combobox form, used internally
*
* @readonly
*/
parentForm: null,
/**
*
* @property {Boolean} hasChanged
* `true` if the combobox has changed its value since last show/hide cycle
*/
hasChanged: false,
statics: {
xcomboboxRenderer: function(xcombobox) {
return function(value, metaData, record, rowIndex) {
if (value === null)
return '';
return xcombobox.store.getById(value.toString()).get('display');
}
}
},
initComponent: function() {
var me = this;
var xComboBoxStoreClass = 'Fdd.data.XComboBoxStore';
var xComboBoxStoreKey = Ext.getClassName(me);
// FIXME: Fix default value to be display and not value field
// Create the combo store if not exists
me.createComboStoreIfNotExists = function() {
// If store is not set, we can't do anything
if (!me.store)
return false;
// If the store is an array, we break the functionality and return to a normal combobox
// because XComboBox is to avoid problems with stores
if (Ext.isArray(me.store))
return false;
// We need the object for the parent store, to avoid missing references
var parentStore = null;
if (Ext.isString(me.store))
parentStore = Ext.getStore(me.store)
else
parentStore = me.store;
// If the store doesn't have the updatedAt variable, we don't enable functionalities
// because that is a requirement
if (!Ext.isDefined(parentStore.updatedAt))
return false;
// If parent store is of type XComboBoxStore, it means that we already have created a combo store
if (Ext.getClassName(parentStore) == xComboBoxStoreClass)
return false;
var comboStore = Fdd.NamespaceKeyedStoreManager.lookup(xComboBoxStoreKey, parentStore.storeId);
if (!comboStore) {
comboStore = Ext.create(xComboBoxStoreClass, parentStore);
Fdd.NamespaceKeyedStoreManager.register(xComboBoxStoreKey, parentStore.storeId, comboStore);
}
me.store = comboStore;
//me.on('afterrender', function(obj, eOpts) {
// obj.setValue(1);
//});
return comboStore;
}
// Load data if required
me.loadUpdatedData = function() {
me.createComboStoreIfNotExists();
if (me.store)
Fdd.NamespaceKeyedStoreManager.lookup(xComboBoxStoreKey, me.store.parentStore.storeId).loadIfNotUpdated();
};
// Load data if required
me.loadUpdatedData();
// Fires loadUpdatedData every time trigger is pressed
me.on('expand', function(obj) {
obj.loadUpdatedData();
});
// TODO: Building a fix for the problem combobox input field shows the value field instead of the display field
me.on('boxready', function(obj) {
obj.parentForm = obj.up('form');
console.log(obj.parentForm);
obj.mon(obj.parentForm, 'edit', function(editor) {
console.log("beforeaction");
console.log(e.originalValue);
console.log(obj);
if (!obj.hasChanged)
obj.setValue(obj.originalValue);
});
obj.mon(obj.parentForm, 'show', function() {
/*console.log("move:");
console.log(obj.getValue());
console.log(obj.inputEl.dom.value);*/
obj.hasChanged = false;
if (obj.parentForm) {
if (obj.getValue() === null)
obj.inputEl.dom.value = "";
else
obj.inputEl.dom.value = obj.store.getById(obj.getValue().toString()).get('display');
}
});
});
me.on('change', function(obj) {
obj.hasChanged = true;
});
// Call parent initializator
me.callParent(arguments);
}
});
我們正在談論的代碼從TODO開始。
我建議忽略前一部分,因爲用於創建商店重複以避免過濾和緩衝存儲。
編輯2:
好像這個問題我想通過這個問題的解決是沒有直接關係的問題,我想了(以不同的方式解決)解決這樣問題可以關閉。
無論如何。
修復組合框?真?你爲什麼不在編輯器中使用另一個組合框? – sha
我不明白你的評論,爲什麼我應該使用另一個組合框?問題是組合框的行爲如何,沒有多個組合框。 –
組合框的行爲方式沒有問題。在我們的項目中,我們到處都有這種結構當你使用roweditor時 - 你是在textfield還是在combobox中編輯這個字段? – sha