2011-09-08 11 views
2

extjsコンボボックスを使用すると問題が発生します(ブラウザに関係なく、ChromeとFFで同じ結果がテストされています)。ExtJS 4 - ComboBox Issue

コンボボックスが正常に読み込まれると、両方のエントリが表示されます。最初に読み込まれた2つのうちの1つを選択できますが、既に選択した後で選択を変更しようとすると、元の値が保持され、選択または変更イベントは発生しません。私は、非選択項目の入力を開始すると、自動完了が引き継がれ、項目を選択するためにリターンキーを押すことができ、選択イベントと変更イベントが発生することがわかりました。選択していない項目をクリックして選択するだけの理由は何ですか?

ここでモデル、リーダー、データストア、およびコンボボックスのコードです:

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

ありがとう:

//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('--------------------------------------------------------------------'); 
     } 
    } 
}); 

は、プロキシ次の文字列を返します。どんな助けもありがとう。


編集:2011-09-08 16時32分CST

私はまだこの問題を考え出していないが、その間に、私は周囲に「汚い」仕事を見つけました... expandイベントは以前の値をクリアしてユーザーに別の値を選択させることができますが、問題は "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で指定します。*コンポーネントがaの子項目になる場合はこのオプションを使用しないでください。コンテナ。コンテナのレイアウトマネージャは、子アイテムをレンダリングして管理する必要があります。*基本的に、コンポーネントがレンダリング自体を管理することは理解していますが、レンダリング自体はコンテナに残されています。 item configを使用してコンポーネントをコンテナに追加し、configのrenderToを削除してみてください。 – nscrob

+0

ありがとうございましたnscrob、私はもともとこのコンボボックスをネストして、コンボボックスと同じ場所にレンダリングされたパネルに入れました。同じ問題が発生しました。私はプロキシを使用せずに "フィールド"と "データ"(現実的ではありませんが興味がありました)にハードコードを使用してもうまく動作するので、データストアと何か関係があると思います。 – SerEnder

+0

これで、グリッドのチェックボックス列モデルで同じ問題があったと思いますが、問題はそのストアが別の場所で使用されていたことがわかりました。実際にはextjs4ではストアに近いので、レコードを変更するには、それを使用してコンポーネントをレンダリングする必要があります。もし店をどこか別の場所で使用しているのであれば、これは問題になるかもしれません... – nscrob

答えて

3

コードに間違いがあります。コンボボックスの設定では、valueField: 'iMonitorId'は小文字のdで指定されますが、モデルの設定ではname: 'iMonitorID'が大きいもので指定されます(プロキシは'iMonitorID'を返します)。

ところで、モデルとストアのフィールド設定の両方のリーダーを使用しています。店舗は既に誤ったフィールド設定を持っているため、正しいモデルのフィールド設定は使用されません。

だから、解決策は次のようになります。

1.は、店舗のconfigにfields: ['iMonitorId','sMonitorName'],を取り除きます。
2.変更valueField'iMonitorID'コンボボックス 'config。

+1

'' ... '' iMonitorId '、' sMonitorName ']の 'fields:問題が始まった後に値をハードコードしたときに来たのですが、 d "...捕獲分子のおかげで。 – SerEnder

+0

私も同様の問題がありました。値フィールドの使用を削除することは私の仕事です。ドキュメンテーションから何をするべきか明確ではない+選択イベントを壊すようだ –