Hi All!
I use the AjaxFormLoop to render a table with multiple columns and
provide inplace-editing capabilities by replacing a particular row with
a different block content. Now I added a Button "SAVE" outside the
AjaxFormLoop component to save all changes made in "one transaction",
but I only want to display the button in case a change was made.
Therefore I defined a 2nd Zone for my Button like:
<span t:type="zone" t:id="saveButtonZone" id="saveButtonZone">
<t:if test="somethingModified">
<br/>
<input type="submit" name="saveGridChanges" class="btn
btn-primary" value="${message:saveChanges}"/>
<p:else>
</p:else></t:if>
</span>
To replace a row in the AjaxFormLoop and update the button Zone
accordingly I use an AjaxResponseRenderer (_arr):
Object onActionFromModifyFormEvent(final long pk)
{
...
if (_request.isXHR()) {
_arr.addRender(_zone).addRender(_zoneSaveButton);
}
return null;
}
which re-renders the AjaxFormLoop (_zone) and the save button
(_zoneSaveButton). I did this for several other methods too (e.g.
checkbox callbacks) and everything is fine.
Unfortunately when adding the same code fragment to the AddRowLink callback
void onAddRowFromModifiedFormEvents()
{
...
if (_request.isXHR()) {
_arr.addRender(_zoneSaveButton);
}
}
Tapestry throws
Console:
Caused by: java.lang.IllegalStateException: Method
org.apache.tapestry5.corelib.internal.HiddenFieldPositioner.discard(HiddenFieldPositioner.java:105)
may no longer be invoked.
at
org.apache.tapestry5.ioc.internal.util.OneShotLock.innerCheck(OneShotLock.java:58)
at
org.apache.tapestry5.ioc.internal.util.OneShotLock.lock(OneShotLock.java:71)
at
org.apache.tapestry5.corelib.internal.HiddenFieldPositioner.discard(HiddenFieldPositioner.java:105)
at
org.apache.tapestry5.internal.services.ajax.AjaxFormUpdateControllerImpl.cleanupAfterPartialZoneRender(AjaxFormUpdateControllerImpl.java:114)
at
$AjaxFormUpdateController_13023b225f815e65.cleanupAfterPartialZoneRender(Unknown
Source)
at
$AjaxFormUpdateController_13023b225f815e5e.cleanupAfterPartialZoneRender(Unknown
Source)
at
WebSite:
An unexpected application exception has occurred.
org.apache.tapestry5.runtime.ComponentEventException
Method
org.apache.tapestry5.corelib.internal.HiddenFieldPositioner.discard(HiddenFieldPositioner.java:105)
may no longer be invoked.
context
eventType: inject
location:
classpath:org/apache/tapestry5/corelib/components/AjaxFormLoop.tml, line 8
3 <t:formfragment t:id="fragment" element="prop:element" visible="true">
4 <t:delegate to="block:ajaxResponse"/>
5 </t:formfragment>
6
7 <t:block id="tail">
8 <t:forminjector element="prop:element" t:id="rowInjector"
show="inherit:show" context="inherit:context">
9 <t:delegate to="prop:addRow"/>
10 <t:block id="defaultAddRow">
11 <t:addrowlink>Add row</t:addrowlink>
12 </t:block>
13 </t:forminjector><t:formfragment t:id="fragment"
element="prop:element" visible="true">
Any idea what I am doing wrong or how to work around it, preferably with
Tapestry? Last resort is something like jquery/live, adding change
callbacks to all fields aso, which I want to avoid, if possible.
Thanks in advance
Jens