2012-06-01 44 views
0

我正在爲組合框構建「修復程序」,因爲它在打開行編輯器時顯示值字段而不是文本框中的顯示字段。但是,要做到這一點,我必須在發送到服務器之前更改組合框的值。要做到這一點,我的想法是鉤住行編輯插件的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:

好像這個問題我想通過這個問題的解決是沒有直接關係的問題,我想了(以不同的方式解決)解決這樣問題可以關閉。

無論如何。

+0

修復組合框?真?你爲什麼不在編輯器中使用另一個組合框? – sha

+0

我不明白你的評論,爲什麼我應該使用另一個組合框?問題是組合框的行爲如何,沒有多個組合框。 –

+0

組合框的行爲方式沒有問題。在我們的項目中,我們到處都有這種結構當你使用roweditor時 - 你是在textfield還是在combobox中編輯這個字段? – sha

回答

1

標準的Combobox控件沒有錯誤。我在許多地方在我的項目中使用它,沒有任何問題。

確保您在編輯器組合框,網格組合框和商店本身中爲valueFields提供了匹配類型。

+0

非常感謝,即使是在漫長的討論中關注我。 –