2011-09-08 132 views
2

使用extjs組合框時(不管瀏覽器是什麼,在Chrome和FF中以相同的結果進行測試),我遇到了一個問題。ExtJS 4 - 組合框問題

組合框加載得很好,兩個條目都顯示出來。我可以選擇最初加載的兩個中的一個,但如果我在選擇後嘗試更改選擇,它會保留原始值,並且不會觸發選擇或更改事件。我發現如果我開始在非選定條目中輸入,自動完成接管,我可以按回車鍵來選擇條目,並選擇事件和更改事件被觸發。爲什麼我不只是簡單地點擊未選擇的條目來選擇它?

這裏的模型,讀卡器,數據存儲和組合框代碼:

//Model 
Ext.define('cbMonitorModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'iMonitorID', type: 'String'}, 
     {name: 'sMonitorName', type: 'String'} 
    ] 
}); 

//Reader 
var cbMonitorReader = Ext.create('Ext.data.JsonReader',{ 
    type: 'json', 
    model: 'cbMonitorModel' 
}); 

//Store 
var cbMonitorDataStore = Ext.create('Ext.data.Store',{ 
fields: ['iMonitorId','sMonitorName'], 
autoLoad: true, 
proxy: { 
    type: 'ajax', 
    url: '/inc/ajax/Monitors.php', 
    actionMethods: 'POST', 
    reader: cbMonitorReader, 
    extraParams: { 
     task: 'getMonitors', 
     domain: sMonitorDomainName 
    } 
} 
}); 

//ComboBox 
Ext.create('Ext.form.ComboBox',{ 
    fieldLabel: 'Monitor', 
    store: cbMonitorDataStore, 
    queryMode: 'local', 
    displayField: 'sMonitorName', 
    valueField: 'iMonitorId', 
    renderTo: Ext.get('monitorSelect'), 
    width: 400, 
    listeners: { 
     select: function(combo, records, opts) { 
      console.log('MonitorComboBox - Select'); 
      console.log(combo); 
      console.log(records); 
      console.log(opts); 
      console.log(cbMonitorDataStore); 
      console.log('--------------------------------------------------------------------'); 
     } 
    } 
}); 

代理返回以下字符串:

[{"iMonitorID":"85","sMonitorName":"6176 - xxx.xxx.xxx.xxx default monitor"},{"iMonitorID":"86","sMonitorName":"14177 - aaa.bbbbbbbbb.com default monitor"}] 

感謝。任何幫助,將不勝感激。


編輯:2011-09-08 16:32 CST

我還沒有想通這個問題了,但在此之前,我已經找到了一個「髒」變通...展開事件清除了以前的值,它允許用戶選擇不同的值,但問題是我無法使用「getValue()」...因此cb.lastSelection[0].raw.iMonitorID字符串...

組合框代碼:

var MonitorCB = Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Monitor', 
    store: cbMonitorDataStore, 
    queryMode: 'local', 
    displayField: 'sMonitorName', 
    valueField: 'iMonitorName', 
    width: 400, 
    renderTo: 'monitorSelect', 
    listeners: { 
     select: function(cb, rec, opts){ 
      console.log(cb.lastSelection[0].raw.iMonitorID); 
     }, 
     expand: function(){this.clearValue()} 
    } 
}); 
+0

以及該組件看起來很好的定義..正如我看到它的問題可能是由renderTo配置造成的......在Api他們指定*不要使用此選項,如果該組件是一個子項目的容器。 Container的佈局管理器負責渲染和管理其子項。*基本上我知道組件不管理渲染本身,而是將它留給Conainer。爲什麼不使用items config將組件添加到容器中,並將配置renderTo刪除。 – nscrob

+0

謝謝nscrob,我原本有這個組合框嵌套在一個面板中,然後渲染到與組合框相同的位置,同樣的問題也發生在那裏。我認爲這與數據存儲有關,因爲如果我不使用代理,但在「字段」和「數據」中使用硬編碼(不現實但很好奇),它的工作原理就很好。 – SerEnder

+0

現在我想到了它,我對網格的複選框列模型有同樣的問題,我發現問題是商店被用在其他地方,事實是,在extjs4中,商店更接近綁定到組件,而對記錄的任何修改都需要提交使用它的組件。如果您在其他地方使用該商店,這可能是問題... – nscrob

回答

3

你的代碼有錯誤。在組合框valueField: 'iMonitorId'中指定了小寫字母d,而在模型配置name: 'iMonitorID'中指定了較大的一個(並且代理返回'iMonitorID' s)。

順便說一句。您正在使用閱讀器和模型以及商店的字段配置。沒有使用正確模型的字段配置,因爲商店已經有錯誤的字段配置。

因此,解決辦法是:

1.拿到店裏的配置擺脫fields: ['iMonitorId','sMonitorName'],
2.更改valueField'iMonitorID'在組合框'config。

+1

''......那麼'字段:['iMonitorId','sMonitorName'],'來自當我在問題開始後對值進行硬編碼時......不能相信我花了那麼長時間尋找「 d「...感謝抓分子。 – SerEnder

+0

我有類似的問題。刪除值域的使用對我有用。目前還不清楚它從文檔中應該做什麼+它似乎只是打破選擇事件 –