2

タペストリー5.2.0を使用すると、問題が発生します。ゾーンを含むコンポーネントを複数回使用します。

この時点で、コンポーネントは同じページで3回使用されていますが、正常に機能しているのは1つのインスタンスのみです。コンポーネントに関連付けられているtmlは次のようになります。

<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
    <t:zone t:id="myZoneId">
        <!-- component's zone content goes there -->
    </t:zone>
</t:container>

この問題の原因は非常に単純です。ご覧のとおり、同じページでこのコンポーネントを複数回使用すると、ゾーンIDが一意にならず、同じIDを持つ複数のゾーンがページに存在します。

ここで私の質問です。コンポーネントがコンテナの外部でゾーンを使用せずに1回または数回使用される場合は常に、コンポーネントのゾーンIDを一意にするためにどのようなアプローチを使用できますか。

よろしくお願いします。

4

1 に答える 1

2

ゾーン ID は手動で処理する必要があります。そうしないと、すべて自動生成されたクライアント ID になってしまいます。

idTML では、 (名前空間なしで) 属性を指定することもできますt:。これは、レンダリングされたマークアップでそのまま使用されます。

<t:zone t:id="myZoneId" id="${zoneClientId}">
    ...
</t:zone>

コンポーネントに何らかの一意の値 (ID など) が存在する場合は、それを使用してクライアント側 ID を作成します。

@Parameter
private MyType myParam;

public String getZoneClientId() {
    return "myZone-" + myParam.getId();
}

zone次に、ゾーンを更新するリンクまたはフォームのパラメーターにも同じ getter メソッドを使用できます。

<a t:type="ActionLink" t:zone="prop:zoneClientId">...</a>

リンクまたはフォームがゾーン自体に含まれている場合は、さらに簡単な解決策があります。

<t:zone t:id="myZoneId">
   ...
   <a t:type="ActionLink" t:zone="^">...</a>
</t:zone>

特別な値^により、Tapestry は最初の囲みゾーンを更新する要素として使用します。

docs の Ajax と Zones のセクションも参照してください。

于 2011-08-31T10:44:57.637 に答える