6

これは私のzulコードです:

<combobox id="digitalPublisherCombobox" value="@load(ivm.inventory.digitalPublisherName)"
        onOK="@command('setDigitalPublisher', digitalPublisherBox = self)" 
        onSelect="@command('setDigitalPublisher', digitalPublisherBox = self)"
        onChanging="@command('setupQuicksearchByEvent', searchlayout = event, prefix = 'PUB', tags = 'PublisherName, PublisherNameTranslit')"
        mold="rounded" hflex="1" buttonVisible="false" autodrop="true">
    <comboitem self="@{each=entry}" value="@{entry.key}" label="@{entry.value}"/>
</combobox>

そして、これは QuickSearch の実装です:

@Command
public void setupQuicksearchByEvent(@BindingParam("searchlayout")Event event, @BindingParam("prefix") String prefix, @BindingParam("tags") String tags) throws WrongValueException, SearchException, IOException
{
    if(event instanceof InputEvent)
    {
        InputEvent inputEvent = (InputEvent) event;
        String inputText = inputEvent.getValue();

        List<String> searchFields = Arrays.asList(tags.split(","));
        ListModel model = new ListModelMap(ZKLogic.findDocsStartingWith(prefix, searchFields, "proxy", inputText), true);
        ListModel subModel = ListModels.toListSubModel(model, Autocompleter.MAP_VALUE_CONTAINS_COMPARATOR, 10);    
        Combobox searchBox = (Combobox) event.getTarget();
        searchBox.setModel(subModel); 

        searchBox.setItemRenderer(new ComboitemRenderer()
        {
            @Override
            public void render( Comboitem item, Object data, int pos ) throws Exception
            {
                String publisherString = data.toString();
                UID key = getUidFromPublisherString(publisherString);

                int startIndex = publisherString.indexOf('=') + 1;
                String publisher = publisherString.substring(startIndex);

                item.setLabel(publisher);
                item.setValue(key);
            }
        });
    }
}

ZKLogic.findDocsStartingWithUID キーと文字列値を持つマップを返します。

上記のコードで、別のウィンドウに切り替えたときにドロップダウン リストを取得することができました。何かを入力してから、別のブラウザーまたはメモ帳ウィンドウを選択する必要があります。すると、コンボアイテムがすぐに表示されます。

だから、私の質問にはまだ答えが必要です.コードでこのウィンドウの切り替えを再現するテクニックはありますか? または、プリロードされたリストを操作する ac があるため、オートコンプリートで何かを行う必要がありますが、このことは、ユーザーがフィールドに何かを入力するたびに、70000 エントリすべてではなく、db から 10 レコードのみを返す必要があります。

編集 20/09/2013: 問題はまだ存在します。私が必要とするのは、コードでレンダリングオプションを強制的に呼び出すことであるため、質問の名前を少し変更します。それを行う方法はありますか?コードはあまり変更されていませんが、render メソッドの print オプションによると、そのメソッドは 2 つ以上の onChange イベントを見逃し、突然 1 つのバリアントのテキストをレンダリングする可能性があります。

データベースが参加する zk フレームワークの別のオートコンプリート オプションをご存知でしょうか? 実装が機能するガイドがあれば、実装を変更する準備ができています。

4

3 に答える 3

1

選択したアイテムをコンボボックスに設定するか、関連するイベントをスローしてみてください

于 2013-09-20T20:36:59.477 に答える
0

解決策は簡単です。本当。総当たりに勝るものはありませんが、それを避けて絶望的に使用しようとしたと思います。

 @Command
public void setupQuicksearchByEvent(@BindingParam("searchlayout")Event event, @BindingParam("prefix") String prefix, @BindingParam("tags") String tags) throws WrongValueException, SearchException, IOException
{
    if(event instanceof InputEvent)
    {
        InputEvent inputEvent = (InputEvent) event;
        String inputText = inputEvent.getValue();

        List<String> searchFields = Arrays.asList(tags.split(","));
        Map<UID, String> publishers = ZKLogic.findDocsStartingWith(prefix, searchFields, "proxy", inputText);

        Combobox searchBox = (Combobox) event.getTarget();
        searchBox.getChildren().clear();

        for (Map.Entry<UID, String > entry : publishers.entrySet())
        {
            Comboitem item = new Comboitem();
            item.setLabel(entry.getValue());
            item.setValue(entry.getKey());
            searchBox.appendChild(item);
        }
    }
}
于 2013-10-01T07:27:59.783 に答える