ストアを使用して、入力時にユーザーに値を提案する ext コンボボックスがあります。
ここにその例があります:コンボボックスの例
提案されたテキストリストがDOMの要素にレンダリングされるようにする方法はありますか? 「applyTo」構成オプションを意味するものではないことに注意してください。これは、テキストボックスを含むコントロール全体を DOM 要素にレンダリングするためです。
ストアを使用して、入力時にユーザーに値を提案する ext コンボボックスがあります。
ここにその例があります:コンボボックスの例
提案されたテキストリストがDOMの要素にレンダリングされるようにする方法はありますか? 「applyTo」構成オプションを意味するものではないことに注意してください。これは、テキストボックスを含むコントロール全体を DOM 要素にレンダリングするためです。
プラグイン内からプライベート メソッドを呼び出したり、オーバーライドしたりできるため、これにはプラグインを使用できます。
var suggested_text_plugin = {
init: function(o) {
o.onTypeAhead = function() {
// Original code from the sources goes here:
if(this.store.getCount() > 0){
var r = this.store.getAt(0);
var newValue = r.data[this.displayField];
var len = newValue.length;
var selStart = this.getRawValue().length;
if(selStart != len){
this.setRawValue(newValue);
this.selectText(selStart, newValue.length);
}
}
// Your code to display newValue in DOM
......myDom.getEl().update(newValue);
};
}
};
// in combobox code:
var cb = new Ext.form.ComboBox({
....
plugins: suggested_text_plugin,
....
});
メソッドのチェーン全体を作成して、元のメソッドを自分のメソッドの前または後に呼び出すことも可能だと思いますが、まだ試していません。
また、非標準のプラグイン定義と呼び出しメソッド (文書化されていない) を使用することについて、私を強く押し付けないでください。それは私の物事の見方です。
編集:
メソッドチェーンは次のように実装できると思います(テストされていません):
....
o.origTypeAhead = new Function(this.onTypeAhead.toSource());
// or just
o.origTypeAhead = this.onTypeAhead;
....
o.onTypeAhead = function() {
// Call original
this.origTypeAhead();
// Display value into your DOM element
...myDom....
};
@qui
考慮すべきもう 1 つの点は、initList が API の一部ではないことです。Ext の将来のリリースでは、そのメソッドがなくなるか、動作が大幅に変更される可能性があります。アップグレードする予定がない場合は、心配する必要はありません。
明確にするために、選択したテキストをテキスト入力の真下以外の場所にレンダリングする必要があります。正しい?
ComboBox は、Ext.DataView、テキスト入力、およびオプションのトリガー ボタンを組み合わせたものです。あなたが望むものに対する公式のオプションはなく、それをハッキングしてあなたが望むものにするのは本当に苦痛です. したがって、最も簡単な方法は (必要なコンポーネントを含む他のライブラリを見つけて使用する以外に)、上記のコンポーネントを使用して独自のライブラリを構築することです。
少し手間はかかりますが、独自のコンポーネントをゼロから作成したり、ComboBox をハッキングして思い通りに動作させるよりもはるかに短時間で済みます。
@qui
Ok。(既存のコンボ フィールドに加えて) 追加の DOM フィールドが必要だと思いました。
しかし、あなたのソリューションは ComboBox クラスのメソッドをオーバーライドしますよね? これにより、すべてのコンボ ボックスが同じ DOM にレンダリングされます。プラグインを使用すると、1 つの特定のインスタンスのみがオーバーライドされます。
@Thevs
あなたは正しい軌道に乗っていたと思います。
私がしたことは、Combobox の initList メソッドをオーバーライドすることでした。
Ext.override(Ext.form.ComboBox, {
initList : function(){
コードを見ると、提案のリストをデータビューにレンダリングする部分が見えます。したがって、apply を必要な dom 要素に設定するだけです。
this.view = new Ext.DataView({
//applyTo: this.innerList,
applyTo: "contentbox",