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 某些部分的理解)。

http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/Ajaxformloop-add-row-link-max-size-tt5730840.html

我也试过使用 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 中测试成功。