我可以在 zk 的 hbox 中使用 include 吗?

Can I use an include inside an hbox in zk?

我的 zul 中有以下代码:

<hbox>
   <include src="firstInclude.zul" />
   <include src="secondInclude.zul" />
</hbox>

我一直收到 firstInclude.zul 的页面未找到错误。 firstInclude.zul 文件与包含上述代码的文件位于同一目录中。另一方面,包含上述代码的 zul 文件动态包含在模态 window 中。 window 的视图模型正在执行此任务。我究竟做错了什么?

相对包含路径根据当前桌面路径(即当前显示的 main.zul 的位置)解析。

如果您想在代码中检查这一点,请在 AbstractExecution:toAbsolutePath() 中放置一个断点并观察传入的 uri 和前置的 currentDirectory

(这个过程是独立于任何组件的,所以<hbox>与它无关。而且这与动态使用无关。)

假设这个静态结构:

/pages/main.zul
/pages/sub/sub.zul
/pages/sub/sub-include.zul

main.zul

<div>
    <include src="sub/sub.zul"/>
</div>

sub/sub.zul

<div>
    SUB
    <div>
        <include src="sub-include.zul"/>
    </div>
</div>

会导致这个错误:

org.zkoss.zk.ui.UiException: Page not found: /pages/sub-include.zul
    at org.zkoss.zk.ui.http.ExecutionImpl.getPageDefinition(ExecutionImpl.java:385)
    at org.zkoss.zul.Include.afterCompose(Include.java:509)
    ...

像下面这样更改包含的 src url 将解决此问题。

<include src="sub/sub-include.zul"/>

我同意这并不明显,但这就是它的行为方式。

更可靠的替代方法是使用绝对路径(以 / 开头)来避免相对路径解析问题。

<include src="/pages/sub/sub-include.zul"/>