Tapestry5:具有类似page-loop-customComponent-form结构的页面不起作用

时间:2010-08-07 18:00:43

标签: tapestry

我有以下情况: 我有在某些上下文中激活的页面(例如“/ 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

2 个答案:

答案 0 :(得分:1)

通过t:context手动恢复组件的状态是正确的方法。编码器只能在循环位于表单内时帮助您;在你的情况下,它是另一种方式。

我怀疑你渲染的区域在客户端都具有相同的ID,因此第一个的内容被替换。您可能需要手动为您的区域分配ID,如下所示:

<t:zone t:id="dayAjaxZone" id="dayAjaxZone${dayIndex}" update="show">

答案 1 :(得分:0)

Answere终于找到了。

  1. 将id =“something $ {counter}”添加到区域activityAjaxZone

  2. 通过此ID(html dom id)引用此区域而不是tapestry id

  3. 它会起作用。

    感谢Josh,他帮助回答:http://markmail.org/message/3lmnwybswwm7lhjm