Tapestry5 Ajaxformloop limit number of rows

人走茶凉 提交于 2019-12-13 14:05:47

问题


I am trying to limit the number of rows that a user can add in an ajaxformloop.

Short example:

For example, the loop found in the tapestry 5 documentation here: http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/AjaxFormLoop.html

If for example I would only like the user to be able to enter 3 phone numbers, how can that be done?

What I have tried:

1) I tried returning null from the onAddRow event, this causes an exception and the exception report page to display - these events shouldn't return null I don't think.

2) I tried adding my own add row button like this:

<p:addRow>
    <t:addrowlink>Add another</t:addrowlink>
</p:addRow>

And then putting a t:if around it, like this:

<t:if test="canAddMorePhones()">    
    <p:addRow>
        <t:addrowlink>Add another</t:addrowlink>
    </p:addRow>
</t:if>

In this case, the "add another" reverts to the default "Add row" button and my add row link doesn't show.

3)I tried moving that t:if inside the , this had similar results.

--------------------------

I am sure that this is a fairly common aim, is there any simple way to do it? Perhaps someone can provide an example, and if possible this can help to go in the documentation as i'm sure i'm not going to be the only one trying to do this.

Note: I did also ask on the T5 users mailing list and had one answer but I can't seem to get it working after the response from Lance (Which I am sure is probably correct, but i'm not sure how to use the AjaxResponseRenderer as per my reply last week, this is probably due to my own technical limitations or understanding of some parts of T5).

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


回答1:


I also tried using ajaxResponseRenderer.addRender as you did in your mailing list code, but it doesn't work because it seems that Tapestry has some problems dealing with updating a component that's busy updating another component. However, AjaxResponseRenderer also supports execution of JavaScript. Taking this approach on the AjaxFormLoop example in the docs, specify the addrowlink as follows:

<p:addrow>
    <t:if test="canAddMorePhones()">
        <t:addrowlink id="addRowLink" t:id="addRowLink">Add another</t:addrowlink>
    </t:if>
</p:addrow>

Then add the following code right before return phone; in onAddRowFromPhones():

ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
    public void run(JavaScriptSupport javascriptSupport) {
        if (!canAddMorePhones()) {
            javascriptSupport.addScript("document.getElementById('addRowLink').style.display = 'none';");
        }
    }
});

This example was tested successfully in Tapestry 5.3.7.



来源:https://stackoverflow.com/questions/31518944/tapestry5-ajaxformloop-limit-number-of-rows

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!