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

时间:2015-05-04 13:30:37

标签: java ajax forms tapestry

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

  

在SetupRender中呈现队列错误[SelectZoneDemo:version]:组件SelectZoneDemo:版本必须由表单组件包围。

来自doc的工作示例(选择组件CarMaker的链接) 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);
    }

1 个答案:

答案 0 :(得分:1)

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

以下是一些选择:

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