2015-05-04 3 views
1

Я использую гобелен 5.3.7, и я хочу использовать элементы формы выбора цепочки Ajax: если я выберу одну опцию в элементе select, другой выбор появится, чтобы выбрать другой элемент на основе вашего первого выбора. Я попробую образец в документе гобелена и адаптирован для моего проекта. Несмотря на то, что мой пользовательский код находится очень близко к образцу, у меня всегда есть следующее сообщение об ошибке:Цепочка нескольких компонентов выбора в Tapestry 5.3 (обновление Ajax)

Визуализировать ошибку очереди в SetupRender [SelectZoneDemo: версия]: Компонент SelectZoneDemo: версия должна быть заключена в компонентной форме ,

Работа образца из док (выстраивание выбора компонентов Автоконцерн)http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/Select.html)

Вот мой код: Файл шаблона (.tml)

<t:form> 
    <p> 
     <t:errors /> 
    </p> 
    <p> 
     <t:select t:id="selectApplicatifs" t:model="selectApplicatifs" 
      t:value="selectedApplicatif" validate="required" zone= "VersionZone" 
      t:zone="versionZone" t:encoder="ApplicatifDtoEncoder" /> 
    </p> 

    <t:zone t:id="versionZone" id="versionZone"> 
     <t:if test="selectedApplicatif"> 
      <p> 
       <t:select t:id="version" model="selectVersions" t:encoder="VersionDtoEncoder" /> 
      </p> 
     </t:if> 
     <p> 
      <t:submit value="literal:Submit" /> 
     </p> 
    </t:zone> 

</t:form> 

Файл Java

@Inject 
    private AjaxResponseRenderer ajaxResponseRenderer; 

    @Inject 
    private IServiceApplicatif serviceApplicatif; 

    @Inject 
    private SelectModelFactory selectModelFactory; 

    @Property 
    @Persist 
    private SelectModel selectApplicatifs; 

    @Property 
    @Persist 
    private String version; 

    @Property 
    @Persist 
    private SelectModel selectVersions; 

    @Inject 
    @Property 
    private ApplicatifDtoEncoder applicatifDtoEncoder; 

    @Inject 
    @Property 
    private VersionDtoEncoder versionDtoEncoder; 

    @Property 
    @Persist 
    private ApplicatifDto selectedApplicatif; 

    @InjectComponent 
    private Zone versionZone; 

    public void onActivate() { 
     List<ApplicatifDto> listApplicatifs = serviceApplicatif.findAllApplicatifDto(); 
     List<VersionDto> listVersionApplicatifs = new ArrayList<VersionDto>(); 
     selectApplicatifs = selectModelFactory.create(listApplicatifs, "nom"); 
     if (selectVersions == null) { 
      selectVersions = selectModelFactory.create(listVersionApplicatifs,"version"); 
     } 
    } 

    public void onValueChangedFromSelectApplicatifs(ApplicatifDto applicatifDto) { 

     List<VersionDto> versionList = applicatifDto.getVersionList(); 
     selectVersions = selectModelFactory.create(versionList,"version"); 

     ajaxResponseRenderer.addRender(versionZone); 
    } 

ответ

0

Rendering зоны внутри формы через AJAX может получить сложно, как вы обнаружили. Поля требуют, чтобы экземпляр FormSupport находился в стеке Environment. Обычно это добавляется в среду, когда родительская форма отображается, но, как вы обнаружили, при рендеринге зоны в форме FormSupport недоступен.

Вот несколько вариантов:

  1. Есть зона, которая оборачивает всю форму и обновить всю форму с помощью AJAX
  2. Вместо того, чтобы обновлять зоны, использовать некоторые JavaScript (через JavaScriptSupport), чтобы обновить параметры в существующем меню выбора
  3. Используйте миксин Observe для обновления зон в форме. Вместо использования основного компонента выбора гобеленов вы можете отобразить свой собственный выбор. Это может потребовать от вас использовать @RequestParameter, чтобы получить значения serveride, когда форма будет окончательно отправлена.
  4. Используйте FormInjector. Я никогда не использовал его сам, но я думаю, что это как-то обманывает окружающую среду. Я не уверен, как вы передадите пользователю выбор в этом случае. Я думаю, что этот компонент, возможно, также был пересмотрен в гобелене 5.4.
Смежные вопросы