1

次のような状況があります: 何らかのコンテキスト ("/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 はそれらをイベント呼び出ししません。フォーム内でのみ機能するようです。しかし、ループ内にフォームがあります。したがって、どんな助けも大歓迎です。

ps 詳細が必要な場合は、完全なソース コード (Google コード) を参照してください: http://code.google.com/p/tasks-journal/source/checkout

UPD : t:context をフォームに渡すことができ、onPrepareForSubmit フェーズでフィールドを手動で復元できることがわかりました (かなり汚れた回避策を介して)。さて、今は NPE はありませんが: 1. これは醜いです。2. これは、フォームの再レンダリングにはつながりません。例外はなく、期待どおりに再レンダリングされません。HTTP 応答を調べたところ、空の括弧 = "{}" しかありません

UPD2 : 私はまだ悪い回避策で遊んでいます。私が onSuccess の場合、「これを返す」ことがわかりました。その後、再レンダリングが行われます。しかし (!) 常にページの最初のフォーム (またはゾーン?) を再レンダリングします。http://my.jetscreenshot.com/2672/20100808-thdx-190kb.jpg

4

2 に答える 2

1

手動でコンポーネントの状態を手動で復元するのt:contextが正しいアプローチです。エンコーダーは、ループがフォーム内にある場合にのみ役立ちます。あなたの場合は逆です。

レンダリングしているすべてのゾーンがクライアント側で同じ ID を持っていると思われるため、最初のゾーンのコンテンツが置き換えられます。次のように、ゾーンに ID を手動で割り当てる必要がある場合があります。

<t:zone t:id="dayAjaxZone" id="dayAjaxZone${dayIndex}" update="show">
于 2010-08-09T08:45:06.927 に答える
0

Answereがついに見つかりました。

  1. id="something${counter}" をゾーン activityAjaxZone に追加します

  2. タペストリー ID ではなく、この ID (html DOM ID) でこのゾーンを参照してください

そして、それはうまくいきます。

回答を手伝ってくれた Josh に感謝します: http://markmail.org/message/3lmnwybswwm7lhjm

于 2010-08-13T02:57:25.893 に答える