2017-05-31 18 views
0

私は現在、Web開発にZKを使用しています。ここに私の場合です:ZKバインドNotifyChangeはonChangingイベントで機能しませんか?

私はインスタント検索を実装し、テキスト変更=>検索を実行します。

ZULがコールonChangingText検索した後

<textbox id="textSearch" sclass="search_text"> 
             <attribute name="onChanging">         
         lbOnChangingSearch.setValue(event.getValue()); 
              vm.onChangingTextSearch();         
             </attribute> 
            </textbox> 
            <label id="lbOnChangingSearch" visible="false"></label> 

     <grid id="gridChapter" model="@load(vm.chapterInPage)"> 
      .... 
     </grid> 

コントローラー・コード

ListModelList<ChapterJoinComic> chapterInPage; 
public ListModelList<ChapterJoinComic> getChapterInPage() { 
    return chapterInPage; 
} 

@NotifyChange({ "topComics", "chapterInPage"}) 
@Command 
    public void onChangingTextSearch() { 

     FilterObject fo = getFilterObject(); 
     fo.setSearch_str(lbOnChangingSearch.getValue()); 

     // 
     doSearch(fo); // Change chapterInPage 


     // Manually post Not 
BindUtils.postNotifyChange(null,null,this.chapterInPage,"chapterInPage"); 
    } 

問題 ファイル、グリッドはデータバインディングを更新していけません。 しかし、私はテキストを変更し続けます(もっとonChangingTextSearchを呼び出してください)。グリッドは更新されますが、更新された値は以前の値です。

グリッドは私の最新のModelオブジェクトよりも少し遅いと思われます。

onChangingイベントの代わりにonOKを使用すると、データバインディングがうまく機能します。

誰でも私を助けることができます。前もって感謝します!

答えて

1

すでに@NotifyChangeを使用するときは、BindUtils.postnotifyChangeを削除する必要があり、あなたはとにかく間違ってそれを使用する:3番目のパラメータはthisの代わりthis.chapterInPageでなければなりません。 The JavaDocは、プロパティが変更されているbeanpropertyの名前を指定する必要があると説明しています。

さらに、コマンドを呼び出すための適切な方法であなたのonChanging属性を置き換える:

<textbox id="textSearch" sclass="search_text" 
     onChanging="@command('onChangingTextSearch')" /> 

は、コマンドの使用方法の詳細についてはthe documentationを参照してください。私はコマンドとしてコマンドを使用しないので、@NotifyChangeはトリガーされないと思います。私が言ったように、あなたのpostNotifyChangeは間違っています。

それが動作するか、その他の問題が残っているかどうかを教えてください。


EDIT

私はちょうど私自身の例を再作成し、動作しているようです。私が代わりに「手動」onChangingリスナーでそれを呼び出すのでは、モデル内の検索メソッドを呼び出すために結合コマンドを使用し

ViewModel -------------------------------- 

    private String searchText = ""; 

    @NotifyChange({"chapterInPage", "searchText"}) 
    @Command 
    public void onChangingTextSearch(@BindingParam("text") String searchText) 
    { 
     this.searchText = searchText; 
    } 

    public String getSearchText() 
    { 
     return searchText; 
    } 

    public ListModelList<String> getChapterInPage() 
    { 
     return new ListModelList<>(searchText.split("")); 
    } 

zul -------------------------------------- 

    <textbox onChanging="@command('onChangingTextSearch', text=event.value)" /> 

    <label id="lbl" value="@load(model.searchText)" /> 

    <listbox model="@load(model.chapterInPage)" /> 

注:このようにそれを試してみてください。このようにして、私は実際にそれをコマンドとして実行し、notifyChangeをトリガーします。リスナーでvm.onChangingTextSearch()のように呼び出すと、@NotifyChangeは無視されます。

このようにして、期待どおりに動作し、すべての文字が入力されると(数ミリ秒遅れて)、リストが更新されます。もう1つの利点は、zkのドキュメンテーションが嫌う、ビュー・モデルにラベルをバインドする必要がないことです。

zulとモデルをこのようにリンクして、動作するかどうか教えてもらえますか?そうでない場合は、コードの動作を再現する例をzkFiddleに作成してみてください。

+0

ご協力いただきありがとうございます。しかし、私も "this.chapterInPage"を "this"に置き換えようとしましたが、それは動作しません。グリッドはこれらのコール(@NotifyChangeまだここに)の後にデータをリフレッシュしないでください – Ronaldinho

+0

私はonOKイベントで、グリッドリフレッシュがうまくいっているが、onChangingがうまくいかないように見えますが、私は理由を理解していません。 – Ronaldinho

+0

@Ronaldinho私のために働く例。それを見て、このように動作するようにコードを変更しようとします。 –

1

マルテに加えて、彼の答え。

テキストボックスは、不必要なネットワークトラフィックを避けるために、onChangeイベントでサーバーにデータを送信するだけです。
あなたはonChangingイベントでサーバーにデータを送信したい場合は、あなたがする必要があります。

<textbox instant="true" /> 

この場合、クライアントがサーバにほぼ瞬時に更新されるに(あなたが速い入力した場合、それはなります入力をやめてください)

+0

あなたは本当にあなたを詰め込んでいませんか?私の経験上、テキストボックスはデフォルトであなたが説明する方法で 'onChanging'を送ります。 'setInstant'のJavaDocは、' true'に設定したときに 'onChange'を送信すると言います。 –

+0

私は今、あなたが意味することと、 'instant'が必要な時を知っています:イベントリスナーの代わりにデータバインディングを使うとき、あなたは' value'にバインドします。 'save'バインディング' onChanging'をトリガするには、 'instant'を' true'に設定する必要があります。 –

+0

チャット中でない限り、私は議論しません。それは簡単な試行で、我々はそれが何かを確認します。通常は 'onChanging'を' instant'と組み合わせてtrueにします。そうでなければ、 'onChange'イベントを使う必要があります。 – chillworld

関連する問題