0

我是 zk6 框架的新手。我创建了一个视图模型类,我试图从一个 zul 导航并在另一个 zul 中加载一些数据:

public class SearchVM {
@Command
@NotifyChange({ "searchBean","slides" })
public void doSearch() {
        //load data (slides) from data base
        //navigate to another zul where i display my data
    }

}

如果我留在同一个 zul 中,则会显示数据,但如果我导航到另一个 zul,我什么也得不到。我尝试使用Executions.sendRedirect("/result.zul")没有成功。

4

1 回答 1

1

不要进行浏览器重定向。使用 AJAX 显示结果。

所以在下面一个 zul 文件有两个区域,一个是默认隐藏的。当您单击该按钮时,它会隐藏第一个区域并显示第二个区域。

<zk>
<zscript>
boolean showFirstZone = true; 
</zscript>
<window visible="${showFirstZone}" id="firstZoneWindow">
    This is first zone. 

    <include src="/WEB-INF/search/search-input.zul"/>

    <button label="Switch To Results" onClick="secondZoneWindow.visible=true;firstZoneWindow.visible=false;" />

</window>

<window visible="${!showFirstZone}" id="secondZoneWindow" >
   This is second zone. 

   <include src="/WEB-INF/search/search-result.zul"/>

</window>
</zk>

请注意,我将包含的 zul 文件放在 /WEB-INF 下,这样就无法从浏览器访问它们,这是个好主意。这样,只有定义系统桌面的入口页面位于站点的主文件夹中(例如,一个用于客户,一个用于员工,一个用于管理员),每个页面都可以重用隐藏在 /WEB-INF 下的包含片段。

理论:

使用 php/jsp,您可以让浏览器请求新页面并绘制它们,以便它们通过会话看到相关日期。ZK 是一个面向桌面的框架,您倾向于在其中构建“单页应用程序”,这意味着由 AJAX 更新的应用程序。执行浏览器重定向不是执行 AJAX 更新。您强制重新获取所有 JS 和 CSS 并重新评估 zul 文件,这比通过 AJAX 进行动态更新效率低得多。

如果您阅读http://books.zkoss.org/wiki/ZK%20Developer%27s%20Reference/UI%20Composing/Component-based%20UI,则表明当您打开一个新 URL 时,您正在创建一个新桌面。ZK 实际上将 body onunload javascript 处理程序放在它呈现的 html 页面上,告诉浏览器在用户导航到新 url 时发送最终 AJAX 事件以销毁现有桌面。因此,当您让用户离开您的第一个 zul 页面时,您实际上会破坏您的 ViewModel。这就是为什么您在浏览器转到的新网址上看不到任何数据的原因;这是一个全新的桌面,它将获得一个全新的 ViewModel,与用户离开的那个无关。

于 2012-06-11T21:36:35.027 回答