2
renderFilterOn: html
|aFilter|
html textInput
onKeyUp: (html jQuery ajax callback: [:val | aFilter := val] 
                value: ((html jQuery this) value);
            script: [:s | 
                s add: ((s jQuery class: 'itemnames') 
                each: (s jQuery ajax callback: [:v | |aName anID |
                aName := ((v subStrings: $,) last).
                anID := ((v subStrings: $,) first).
                 ((aName asUppercase) includesSubString: (aFilter asUppercase))
                    ifFalse: ["Do something here to hide values"]] value: (Array with: ((html jQuery this) attributeAt: 'id') with: (html jQuery this) text)))
                    ]
        )

では、「値を非表示にするためにここで何かを行う」ではどうすればよいでしょうか。

取得した ID は、親の「tr」要素を非表示にする「td」要素の ID です。

テーブルには何千もの結果が含まれる可能性があり、キーを押すたびにフィルタリングされた結果で新しいコンポーネントを表示すると、処理が非常に遅くなるため、新しいコンポーネントを実行してレンダリングすることは本当にしたくありません。

4

2 に答える 2

2

代わりに JQAutocomplete コンポーネントを確認することをお勧めします。これはjQuery UI Autocompleteの Seaside ラッパーです。

この種の動作では、キーストロークごとにサーバーへのコールバックが実際には必要ありません。代わりに、特定の文字数 (1 の場合もある) から開始して、サーバーに対して要求が実行され、アイテムのリストが取得されます。これは、クライアント側でさらに絞り込むことができます。

于 2013-06-20T10:17:41.187 に答える
2

速度が心配で、最初のレンダリング中にすでにすべてのデータをクライアントに送信している場合は、クライアントの JS ですべてのフィルタリングを行う必要があります。

次のような CSS クラスを作成します。

.hideRow {
     display:none;
} 

入力に入力された内容に基づいて、そのクラスを行に追加または削除します。

入力レンダリング メソッドを次のように変更します。

renderFilterOn:html
html textInput
     id: html nextId;
     onKeyUp:((html jQuery id: html lastId) call:'filterRows').

次に、入力の値に基づいてクラスを追加または削除する filterRows 関数を含む、そのページに提供する静的 js ファイルを用意します。

于 2013-06-20T17:43:17.933 に答える