在Tapestry 5.3中链接多个选择组件(Ajax更新)

我正在使用tapestry 5.3.7,我想使用Ajax链接选择表单元素:如果我在select元素中选择一个选项,则另一个选择似乎根据您的第一选择选择另一个元素。 我在tapestry doc中尝试了一个示例,并根据我的项目进行了调整。 尽管我的自定义代码非常接近样本,但我总是有以下错误:

SetupRender中的渲染队列错误[SelectZoneDemo:version]:组件SelectZoneDemo:版本必须由Form组件括起来。

来自doc的工作样本(选择组件的链接CarMaker) http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/Select.html )

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

 

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 listApplicatifs = serviceApplicatif.findAllApplicatifDto(); List listVersionApplicatifs = new ArrayList(); selectApplicatifs = selectModelFactory.create(listApplicatifs, "nom"); if (selectVersions == null) { selectVersions = selectModelFactory.create(listVersionApplicatifs,"version"); } } public void onValueChangedFromSelectApplicatifs(ApplicatifDto applicatifDto) { List versionList = applicatifDto.getVersionList(); selectVersions = selectModelFactory.create(versionList,"version"); ajaxResponseRenderer.addRender(versionZone); } 

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

这里有几个选择:

  1. 有一个包装整个表单的区域,并通过ajax更新整个表单
  2. 使用一些javascript(通过JavaScriptSupport )更新现有选择菜单中的选项,而不是刷新区域
  3. 使用Observe mixin更新表单中的区域。 您可以渲染自己的选择,而不是使用核心挂毯选择组件。 这可能要求您在最终提交表单时使用@RequestParameter来获取值serveride。
  4. 使用FormInjector 。 我自己从未使用它,但我认为它会以某种方式欺骗环境。 我不确定你是如何在活动中传递用户的选择的。 我认为这个组件也可能在挂毯5.4中被废弃了。