ZK绑定NotifyChange无法处理onChanging事件?

时间:2017-05-31 04:08:57

标签: binding onchange zk

我目前使用ZK进行网络开发。这是我的情况:

我实施即时搜索,一旦文字更改=>进行搜索。

Zul文件

    <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");  
    }

问题 调用onChangingText搜索后,Grid不会更新数据绑定。 但是,如果我继续更改文本(更多调用onChangingTextSearch)。网格将更新,但更新的值是先前的值。

看起来Grid比我最新的Model对象慢了一步。

注意如果我使用onOK而不是onChanging事件,则数据绑定效果很好。

任何人都可以帮助我。提前谢谢!

2 个答案:

答案 0 :(得分:2)

除了Malte他的答案。

Textbox仅通过onChange事件向服务器发送数据,以避免不必要的网络流量 如果要使用onChanging事件将数据发送到服务器,则需要执行以下操作:

<textbox instant="true" /> 

在这种情况下,客户端几乎会立即更新到服务器(如果你打字很快,就会在你停止输入的时候)

答案 1 :(得分:1)

您应该在使用BindUtils.postnotifyChange时删除@NotifyChange,并且无论如何都使用了错误:第三个参数应该是this而不是this.chapterInPageThe JavaDoc说明您需要指定其属性正在更改的beanproperty的名称。

此外,使用正确的方法替换onChanging属性来调用命令:

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

有关如何使用命令的更多信息,请参阅the documentation。我认为因为您不将该命令用作命令,所以不会触发@NotifyChange。正如我所说,你的postNotifyChange是错误的。

让我知道这是否有效或是否还有其他问题。

修改

我只是自己重新创建了一个例子,它似乎有效。试试这样:

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)" />

请注意,我使用命令绑定来调用模型中的搜索方法,而不是在onChanging侦听器中“手动”调用它。这样,我实际上将它作为命令执行,触发notifyChange。当您在侦听器中将其称为vm.onChangingTextSearch()时,@NotifyChange将被忽略。

这样,它按预期工作,并且每个字符都被键入(好吧,在几毫秒的延迟之后),列表会更新。另一个优点是您不必将标签绑定到视图模型中,这是zk文档不鼓励的。

你可以试着像这样链接你的zul和模型,并告诉我它是否有效。如果没有,您可能想尝试在zkFiddle上创建一个重新生成代码行为的示例。