Zkoss 在 zhtml 中使用模板

Zkoss using template in zhtml

美好的一天。这是我的 zhtml

<x:html xmlns="http://www.zkoss.org/2005/zul"
        xmlns:x="xhtml"
        src="/components/public-page-template.html">
  <div viewModel="@id('vm') @init('TestViewModel')">
    <div children="@init(vm.testList)">
      <template name="children">
        <checkbox label="@load(each)"/>
      </template>
    </div>
  </div>
</x:html>

并查看模型

public class TestViewModel {
  public List<String> getTestList(){
    return List.of("one", "two", "three");
  }
}

我希望在呈现的 html 中看到 3 个复选框,但我得到 3 个 span

<div id="mXBQ2" class="z-div">
  <div id="mXBQ3" class="z-div">
    <span id="mXBQ4" class="z-label">one</span>
    <span id="mXBQ5" class="z-label">two</span>
    <span id="mXBQ6" class="z-label">three</span>
  </div>
</div>

无论我在模板中放入什么,我都会得到 3 个跨度,模板被完全忽略。但是如果把 zhtml 改成 zul

<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.spring.DelegatingVariableResolver" ?>

<div xmlns="http://www.zkoss.org/2005/zul" viewModel="@id('vm') @init('TestViewModel')">
  <div children="@load(vm.testList)">
    <template name="children">
      <checkbox label="@load(each)"/>
    </template>
  </div>
</div>

然后模板按预期工作,我在结果中看到 3 个复选框 html。

如何使模板在我的 zhtml 中工作?

我想,您遗漏的事实是 <template> 元素不是 zul 组件(而是控制组件创建方式的 special ZUML elements)。 当 运行 你的示例代码时,我得到一个异常......它表明出了什么问题(或多或少很清楚)。

org.zkoss.zk.ui.metainfo.DefinitionNotFoundException: 
    Component definition not found: template in [LanguageDefinition: xul/html]

相反,您必须为这些特殊元素声明和使用相应的 namespace "zk"(.zhtml 文件与 .zul 文件具有不同的解析规则)

<x:html xmlns="http://www.zkoss.org/2005/zul"
        xmlns:x="xhtml"
        xmlns:zk="zk"
        src="/components/public-page-template.html">
...
   <zk:template>
   ...
   </zk:template>

除此之外,我不确定根元素 x:htmlsrc 属性有什么作用。在我的测试中,它被清楚地呈现给 DOM 元素,我假设您有自己的自定义处理处理。