Java 在Tapestry 5.3(Ajax更新)中链接多个select组件

Java 在Tapestry 5.3(Ajax更新)中链接多个select组件,java,ajax,forms,tapestry,Java,Ajax,Forms,Tapestry,我使用的是tapestry 5.3.7,我想使用Ajax链接选择表单元素:如果我在一个选择元素中选择一个选项,另一个选择将根据您的第一个选择选择另一个元素。我在tapestry文档中尝试了一个示例,并根据我的项目进行了调整。尽管我的自定义代码与示例非常接近,但我始终存在以下错误: SetupRender[SelectZoneDemo:version]:组件SelectZoneDemo:version中的渲染队列错误必须由表单组件括起。 文件中的工作样本(选定零部件汽车制造商的链接)) 这是我的密

我使用的是tapestry 5.3.7,我想使用Ajax链接选择表单元素:如果我在一个选择元素中选择一个选项,另一个选择将根据您的第一个选择选择另一个元素。我在tapestry文档中尝试了一个示例,并根据我的项目进行了调整。尽管我的自定义代码与示例非常接近,但我始终存在以下错误:

SetupRender[SelectZoneDemo:version]:组件SelectZoneDemo:version中的渲染队列错误必须由表单组件括起。

文件中的工作样本(选定零部件汽车制造商的链接)

这是我的密码: 模板文件(.tml)



Java文件

@Inject
私人AjaxResponsenderer AjaxResponsenderer;
@注入
私人iSeries应用程序服务应用程序;
@注入
私有SelectModelFactory SelectModelFactory;
@财产
@坚持
私有选择模型选择应用程序;
@财产
@坚持
私有字符串版本;
@财产
@坚持
私有选择模型选择版本;
@注入
@财产
专用应用程序加密码应用程序加密码;
@注入
@财产
私有版本的ToEncoder版本的ToEncoder;
@财产
@坚持
私有应用程序D,用于选择应用程序F;
@注射组分
专用区版本区;
激活时的公共无效(){
List listApplicationFS=serviceApplication.findallapplicationfdto();
List ListVersionApplicationFS=new ArrayList();
selectApplicationFS=selectModelFactory.create(listApplicationFS,“nom”);
如果(selectVersions==null){
selectVersions=selectModelFactory.create(ListVersionApplicationFS,“版本”);
}
}
public void从选定的ApplicationFS更改的值(ApplicationFDto ApplicationFDTO){
List versionList=applicationdo.getVersionList();
selectVersions=selectModelFactory.create(versionList,“version”);
ajaxResponseRenderer.addRender(versionZone);
}

正如您所发现的,通过ajax在表单中呈现区域可能会变得棘手。字段要求实例位于堆栈上。这通常在父窗体渲染时添加到环境中,但正如您所发现的,在窗体中渲染区域时,FormSupport不可用

这里有几个选项:

  • 有一个区域可以包装整个表单,并通过ajax更新整个表单
  • 使用一些javascript(通过)更新现有选择菜单中的选项,而不是刷新区域
  • 使用mixin更新表单中的区域。您可以渲染自己的选择,而不是使用核心tapestry选择组件。这可能需要您在表单最终提交时使用@RequestParameter获取服务器端的值
  • 使用。我自己从来没有用过它,但我认为它不知何故欺骗了环境。我不确定您在活动中如何传递用户的选择。我认为这个组件也可能在tapestry 5.4中被废弃
  • <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>
    
        @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);
        }