我目前使用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事件,则数据绑定效果很好。
任何人都可以帮助我。提前谢谢!
答案 0 :(得分:2)
除了Malte他的答案。
Textbox仅通过onChange
事件向服务器发送数据,以避免不必要的网络流量
如果要使用onChanging
事件将数据发送到服务器,则需要执行以下操作:
<textbox instant="true" />
在这种情况下,客户端几乎会立即更新到服务器(如果你打字很快,就会在你停止输入的时候)
答案 1 :(得分:1)
您应该在使用BindUtils.postnotifyChange
时删除@NotifyChange
,并且无论如何都使用了错误:第三个参数应该是this
而不是this.chapterInPage
。 The JavaDoc说明您需要指定其属性正在更改的bean
和property
的名称。
此外,使用正确的方法替换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上创建一个重新生成代码行为的示例。