Многократное использование пользовательского компонента, содержащего зону

Я столкнулся с проблемой при использовании гобелена 5.2.0: многократное использование компонента, содержащего зону.

На данный момент компонент используется 3 раза на одной и той же странице, но только один экземпляр работает хорошо. 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>

Причина этой проблемы очень проста, как мы видим, если мы используем этот компонент несколько раз на одной и той же странице, то идентификатор зоны не будет уникальным, и на странице будет присутствовать несколько зон с одним и тем же идентификатором.

Теперь вот мой вопрос: какой подход можно использовать, чтобы сделать идентификатор зоны в компоненте уникальным, когда компонент используется один или несколько раз и без использования зоны вне контейнера.

Заранее спасибо за ваши идеи.


person Community    schedule 29.08.2011    source источник


Ответы (1)


Вам придется позаботиться об идентификаторах зон вручную, иначе все они будут иметь автоматически сгенерированный идентификатор клиента.

В вашем TML вы также можете указать атрибут id (без пространства имен t:), который затем будет использоваться как есть в отображаемой разметке:

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

Если в вашем компоненте присутствует какое-то уникальное значение (например, идентификатор), используйте его для создания идентификатора на стороне клиента:

@Parameter
private MyType myParam;

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

Затем вы можете использовать тот же метод получения для параметра zone в ваших ссылках или формах, которые также обновляют зону:

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

Если ссылка или форма содержится внутри самой зоны, есть еще более простое решение:

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

Специальное значение ^ заставляет Tapestry использовать первую окружающую зону в качестве элемента для обновления.

Также взгляните на раздел Ajax и Zones в документации, где объясняются некоторые об этом более подробно.

person Henning    schedule 31.08.2011
comment
Спасибо, это именно то, что я искал. - person ; 31.08.2011
comment
На самом деле, каждый рендеринг Зоны будет генерировать уникальный идентификатор на стороне клиента, основанный на идентификаторе компонента, но с суффиксом, чтобы сделать его уникальным. Суффикс непредсказуем, особенно когда задействован частичный рендеринг страницы Ajax. В любом случае, при управлении многими зонами полезно назначать определенные идентификаторы на стороне клиента ... пример того, как Tapestry уходит с дороги. - person Howard M. Lewis Ship; 01.09.2011
comment
Использование подхода zone=^ прекрасно, когда оно применимо, поскольку компонентам внутри Zone, которые хотят обновить включающую Zone, не нужно знать clientId Zone, что означает, что мы можем позволить Tapestry сгенерировать этот clientId. - person Howard M. Lewis Ship; 01.09.2011