我有以下情况: 我有在某些上下文中激活的页面(例如“/ page / ctx1”) 我有通过t:loop
插入页面的组件DayJournalItem<div t:type="Loop" t:source="journalDays" t:value="journalDay"
t:encoder="dayEncoder"><t:DayJournalItem day="journalDay"
cacheContainer="cacheContainer" /></div>
DayJournalItem与其他组件ActivityJournalItem有另一个循环,其形式为
<div xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
<t:zone t:id="dayAjaxZone" update="show">
<div class="dayHeader">${dayHeader}</div> <div class="dayBody">
<div t:type="Loop" t:source="activities" t:value="activity"><t:ActivityJournalItem
activity="activity" cacheContainer="cacheContainer" /></div>
</div>
</t:zone></div>
ActivityJournalItem组件
<div xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
<t:zone t:id="activityAjaxZone" update="show">
<t:if test="${editingActivity}">
<div class="activityEditFormBody">
<form t:type="form" t:id="activityForm" t:zone="activityAjaxZone">
....
<input t:id="Save" t:type="Submit" value="Save" />
<input t:id="Cancel" t:type="Submit" value="Cancel" />
</form>
</div>
</t:if>
<t:if test="${!editingActivity}">
<div>viewing activity: ${activity.id}</div>
</t:if>
</t:zone></div>
问题是 - 当我按下提交按钮NullPointerException时出现。我的自定义组件中的所有字段都为null。 Tapestry似乎无法正确恢复上下文。您可以在此处查看屏幕截图:http://my.jetscreenshot.com/2672/20100807-tbfe-235kb.jpg
我想我在表单,循环或某处丢失了一些参数。并且无法弄清楚出了什么问题。顺便说一句,我试图使用编码器,但Tapestry没有事件要求它们 - 似乎它们只在表单内部工作。但我已经形成了内部循环。 所以任何帮助都非常感谢。
P.S。如果您需要更多详细信息,可以查看完整的源代码(在Google代码中):http://code.google.com/p/tasks-journal/source/checkout
UPD :我发现我可以将t:context传递给form,而在onPrepareForSubmit阶段我可以手动恢复字段(通过非常糟糕的解决方法)。嗯,现在没有NPE,但是:1。这很难看;这不会导致形式重新渲染。没有例外,也没有按预期退回。我检查了HTTP响应,只有空括号=“{}”
UPD2 :我仍在使用糟糕的解决方法。我想出如果我在onSuccess上会“退回”;然后重新出现。但是(!)它总是在页面上重新呈现第一个表单(或区域?)。 http://my.jetscreenshot.com/2672/20100808-thdx-190kb.jpg
答案 0 :(得分:1)
通过t:context
手动恢复组件的状态是正确的方法。编码器只能在循环位于表单内时帮助您;在你的情况下,它是另一种方式。
我怀疑你渲染的区域在客户端都具有相同的ID,因此第一个的内容被替换。您可能需要手动为您的区域分配ID,如下所示:
<t:zone t:id="dayAjaxZone" id="dayAjaxZone${dayIndex}" update="show">
答案 1 :(得分:0)
Answere终于找到了。
将id =“something $ {counter}”添加到区域activityAjaxZone
通过此ID(html dom id)引用此区域而不是tapestry id
它会起作用。
感谢Josh,他帮助回答:http://markmail.org/message/3lmnwybswwm7lhjm