如何在子模板中包含部分模板
How to include partial templates in child templates
现在我有一个 base.leaf
文件可以成功从其他文件导入正文。
/// base.leaf
<!DOCTYPE html>
<html>
<head>
</head>
<body>
.
.
.
<!-- Begin page content -->
<div class="body-content">
#import("content")
</div>
.
.
.
</body>
</html>
在我的 report.leaf
文件中,我需要根据所选选项在此页面底部显示不同的报告模板。例如,如果选择 Wire
,我想从 wire.leaf
文件中导入该部分代码,依此类推。在 GRAILS GROOVY 中,导入部分文件由 <g:render template="/shared/report/wire" />
完成。但我似乎无法在 vapor/leaf
中弄清楚如何这样做。
/// report.leaf
#extend("base")
#export("content") {
<h2>Generate Report</h2>
<section>
<ul>
<li>
<label for="report">select report</label>
<select name="report">
<option value="-1">-- Select Report --</option>
<option value="1">Purchaser Confirm</option>
<option value="2">Wire</option>
<option value="3">Withdrawal Letter</option>
</select>
</li>
<li>
<input type="submit" value="run report" />
</li>
</ul>
</section>
/// Display different report templates based on the selected option
<!-- #export("report") { #embed("section") } -->
<!-- #import("wire") -->
<!-- #embed("section") -->
<!-- #import("report-content") -->
}
这是我的 wire.leaf
文件。
/// wire.leaf
<!--
/// Trying the: #export("report") { #embed("section") }
<section>
<h3>Wire info for Loan # 123456789</h3>
<div>
<ul>
<li>Name: Marlin Bank</li>
<li>CMG: 007</li>
<li>MtDt: 005689</li>
<li>CUSIP: BDTK001</li>
<li>GP: 5</li>
</ul>
</div>
<div>
<input type="submit" value="print" />
</div>
</section>
-->
/// Trying the: #import("report-content")
#export("report-content") {
<section>
<h3>Wire info for Loan # 123456789</h3>
<div>
<ul>
<li>Name: Marlin Bank</li>
<li>CMG: 007</li>
<li>MtDt: 005689</li>
<li>CUSIP: BDTK001</li>
<li>GP: 5</li>
</ul>
</div>
<div>
<input type="submit" value="print" />
</div>
</section>
}
我确实阅读了 this 关于 #embed
的文档,但我仍然很困惑。任何帮助将不胜感激!
Vapor 在服务器端运行。这意味着它不会自己知道在呈现模板时客户端选择了哪个选项。当用户可以看到页面并与之交互时,Vapor 就不再涉及了。
这意味着您有两个选择。使用客户端编程(即 JavaScript 或其众多框架之一)在用户选择模板时显示正确的模板,或者使客户端选择选项的操作强制从 Vapor 服务器重新加载现在知道要生成什么模板了。
JavaScript 选项:您将在生成的 HTML 中包含所有选项的 HTML 代码,为每个选项设置类似 display: none
的代码,以及select
框上的侦听器,它会根据需要动态显示和隐藏内容;或者,使用 Vue.js 之类的东西为您处理模板,甚至可能完全绕过 Leaf。
服务器端选项:您应该在 select
框中收听。用户选择一个选项的行为应该导致 window 导航到类似 /report/?option=wire
的地方。 Vapor 应该注意名为 option
的 GET
变量,如果存在,则呈现适当的模板部分。
(混合选项,为了完整性:当用户选择一个选项时,JS向Vapor发送请求仅内容部分并将其插入到文档中。)
现在我有一个 base.leaf
文件可以成功从其他文件导入正文。
/// base.leaf
<!DOCTYPE html>
<html>
<head>
</head>
<body>
.
.
.
<!-- Begin page content -->
<div class="body-content">
#import("content")
</div>
.
.
.
</body>
</html>
在我的 report.leaf
文件中,我需要根据所选选项在此页面底部显示不同的报告模板。例如,如果选择 Wire
,我想从 wire.leaf
文件中导入该部分代码,依此类推。在 GRAILS GROOVY 中,导入部分文件由 <g:render template="/shared/report/wire" />
完成。但我似乎无法在 vapor/leaf
中弄清楚如何这样做。
/// report.leaf
#extend("base")
#export("content") {
<h2>Generate Report</h2>
<section>
<ul>
<li>
<label for="report">select report</label>
<select name="report">
<option value="-1">-- Select Report --</option>
<option value="1">Purchaser Confirm</option>
<option value="2">Wire</option>
<option value="3">Withdrawal Letter</option>
</select>
</li>
<li>
<input type="submit" value="run report" />
</li>
</ul>
</section>
/// Display different report templates based on the selected option
<!-- #export("report") { #embed("section") } -->
<!-- #import("wire") -->
<!-- #embed("section") -->
<!-- #import("report-content") -->
}
这是我的 wire.leaf
文件。
/// wire.leaf
<!--
/// Trying the: #export("report") { #embed("section") }
<section>
<h3>Wire info for Loan # 123456789</h3>
<div>
<ul>
<li>Name: Marlin Bank</li>
<li>CMG: 007</li>
<li>MtDt: 005689</li>
<li>CUSIP: BDTK001</li>
<li>GP: 5</li>
</ul>
</div>
<div>
<input type="submit" value="print" />
</div>
</section>
-->
/// Trying the: #import("report-content")
#export("report-content") {
<section>
<h3>Wire info for Loan # 123456789</h3>
<div>
<ul>
<li>Name: Marlin Bank</li>
<li>CMG: 007</li>
<li>MtDt: 005689</li>
<li>CUSIP: BDTK001</li>
<li>GP: 5</li>
</ul>
</div>
<div>
<input type="submit" value="print" />
</div>
</section>
}
我确实阅读了 this 关于 #embed
的文档,但我仍然很困惑。任何帮助将不胜感激!
Vapor 在服务器端运行。这意味着它不会自己知道在呈现模板时客户端选择了哪个选项。当用户可以看到页面并与之交互时,Vapor 就不再涉及了。
这意味着您有两个选择。使用客户端编程(即 JavaScript 或其众多框架之一)在用户选择模板时显示正确的模板,或者使客户端选择选项的操作强制从 Vapor 服务器重新加载现在知道要生成什么模板了。
JavaScript 选项:您将在生成的 HTML 中包含所有选项的 HTML 代码,为每个选项设置类似 display: none
的代码,以及select
框上的侦听器,它会根据需要动态显示和隐藏内容;或者,使用 Vue.js 之类的东西为您处理模板,甚至可能完全绕过 Leaf。
服务器端选项:您应该在 select
框中收听。用户选择一个选项的行为应该导致 window 导航到类似 /report/?option=wire
的地方。 Vapor 应该注意名为 option
的 GET
变量,如果存在,则呈现适当的模板部分。
(混合选项,为了完整性:当用户选择一个选项时,JS向Vapor发送请求仅内容部分并将其插入到文档中。)