Tapestry5 Ajaxformloop 限制行数
Tapestry5 Ajaxformloop limit number of rows
我正在尝试限制用户可以在 ajaxformloop 中添加的行数。
简短示例:
例如,在此处的 Tapestry 5 文档中找到的循环:http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/AjaxFormLoop.html
例如,如果我只希望用户能够输入 3 phone 个数字,该怎么做?
我试过的:
1) 我尝试从 onAddRow 事件中 returning null,这会导致异常并显示异常报告页面 - 我认为这些事件不应该 return null。
2) 我试着像这样添加自己的添加行按钮:
<p:addRow>
<t:addrowlink>Add another</t:addrowlink>
</p:addRow>
然后在它周围放一个t:if,像这样:
<t:if test="canAddMorePhones()">
<p:addRow>
<t:addrowlink>Add another</t:addrowlink>
</p:addRow>
</t:if>
在这种情况下,"add another" 恢复为默认的 "Add row" 按钮,我的添加行 link 不显示。
3)我尝试将 t:if 移动到 中,结果相似。
-------------------------
我相信这是一个相当普遍的目标,有什么简单的方法可以做到吗?也许有人可以提供一个例子,如果可能的话,这有助于进入文档,因为我确信我不会是唯一一个尝试这样做的人。
注意:我也曾在 T5 用户邮件列表上询问过并得到了一个答案,但在 Lance 的回复后我似乎无法让它工作(我确信这可能是正确的,但我不确定如何根据我上周的回复使用 AjaxResponseRenderer,这可能是由于我自己的技术限制或对 T5 某些部分的理解)。
我也试过使用 ajaxResponseRenderer.addRender
,就像您在邮件列表代码中所做的那样,但它不起作用,因为似乎 Tapestry has some problems dealing with updating a component that's busy updating another component。不过,AjaxResponseRenderer
也支持执行JavaScript。在文档中的 AjaxFormLoop
示例中采用这种方法,指定 addrowlink
如下:
<p:addrow>
<t:if test="canAddMorePhones()">
<t:addrowlink id="addRowLink" t:id="addRowLink">Add another</t:addrowlink>
</t:if>
</p:addrow>
然后在onAddRowFromPhones()
中的return phone;
之前添加如下代码:
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
public void run(JavaScriptSupport javascriptSupport) {
if (!canAddMorePhones()) {
javascriptSupport.addScript("document.getElementById('addRowLink').style.display = 'none';");
}
}
});
此示例在 Tapestry 5.3.7 中测试成功。
我正在尝试限制用户可以在 ajaxformloop 中添加的行数。
简短示例:
例如,在此处的 Tapestry 5 文档中找到的循环:http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/AjaxFormLoop.html
例如,如果我只希望用户能够输入 3 phone 个数字,该怎么做?
我试过的:
1) 我尝试从 onAddRow 事件中 returning null,这会导致异常并显示异常报告页面 - 我认为这些事件不应该 return null。
2) 我试着像这样添加自己的添加行按钮:
<p:addRow>
<t:addrowlink>Add another</t:addrowlink>
</p:addRow>
然后在它周围放一个t:if,像这样:
<t:if test="canAddMorePhones()">
<p:addRow>
<t:addrowlink>Add another</t:addrowlink>
</p:addRow>
</t:if>
在这种情况下,"add another" 恢复为默认的 "Add row" 按钮,我的添加行 link 不显示。
3)我尝试将 t:if 移动到 中,结果相似。
-------------------------
我相信这是一个相当普遍的目标,有什么简单的方法可以做到吗?也许有人可以提供一个例子,如果可能的话,这有助于进入文档,因为我确信我不会是唯一一个尝试这样做的人。
注意:我也曾在 T5 用户邮件列表上询问过并得到了一个答案,但在 Lance 的回复后我似乎无法让它工作(我确信这可能是正确的,但我不确定如何根据我上周的回复使用 AjaxResponseRenderer,这可能是由于我自己的技术限制或对 T5 某些部分的理解)。
我也试过使用 ajaxResponseRenderer.addRender
,就像您在邮件列表代码中所做的那样,但它不起作用,因为似乎 Tapestry has some problems dealing with updating a component that's busy updating another component。不过,AjaxResponseRenderer
也支持执行JavaScript。在文档中的 AjaxFormLoop
示例中采用这种方法,指定 addrowlink
如下:
<p:addrow>
<t:if test="canAddMorePhones()">
<t:addrowlink id="addRowLink" t:id="addRowLink">Add another</t:addrowlink>
</t:if>
</p:addrow>
然后在onAddRowFromPhones()
中的return phone;
之前添加如下代码:
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
public void run(JavaScriptSupport javascriptSupport) {
if (!canAddMorePhones()) {
javascriptSupport.addScript("document.getElementById('addRowLink').style.display = 'none';");
}
}
});
此示例在 Tapestry 5.3.7 中测试成功。