【问题标题】:Modifying FormInjector context information in Tapestry 5 dynamically在 Tapestry 5 中动态修改 FormInjector 上下文信息
【发布时间】:2010-06-04 12:54:12
【问题描述】:

我当前的问题是关于在FormInjector 中动态更新上下文信息,我之前的问题Updating a zone inside a form in Tapestry 5 可能包含有用的背景信息。

我在模板中添加了以下内容。

<div t:type="FormInjector" t:id="injector" t:context="item.id"/>

以及我的组件类中的以下内容。

@OnEvent(component = "injector")
Block loadItemFields(String id) {
    item = itemRepository.find(id);
    return itemFieldsBlock;
}

一切正常,出现新的表单域,但搜索始终使用相同的id。我想在触发事件之前用 JavaScript 更改id,但我不知道如何实现。

如果需要其他信息,我很乐意提供。

【问题讨论】:

    标签: java ajax forms tapestry


    【解决方案1】:

    使用上下文参数传递动态值不是我的首选。 (FormInjector 组件会生成一个 URL 来触发事件处理程序,然后包含上下文 - 但是,这是在组件呈现时完成的,并不意味着是动态的。)

    我会摆脱上下文参数并找到一种不同的方式来提交值。一种可能是通过 AJAX 提交表单并在回调中触发注入:

    this.myFormElement.observe('change', this.onChange.bindAsEventListener(this));
    
    ...
    
    onChange: function(event) {
        this.myFormElement.form.request({
               onSuccess: this.afterFormSubmitted.bind(this)
        });
    },
    
    afterFormSubmitted: function() {
       this.formInjector.trigger();
    }
    

    这样,当你触发表单注入时,表单元素的值已经在服务器端设置好了,你可以在你的注入事件处理程序中使用它。

    【讨论】:

    • 我希望避免提交虚假表单。您还有其他想法还是我应该完全改变我的方法?
    • @Ponzao:如果您没有将上下文绑定到 FormInjector,然后修改存储在其中某处的事件 URL,您可能仍然可以使用上下文方法......但它不会很漂亮.更好的选择可能是使用两种不同的形式:一种是提交以加载区域内容,另一种是完全在区域内。如果在你的情况下这是可能的,那就是要走的路。
    • 好的,谢谢,我还不知道该走哪条路,但您的回答给了我足够的选择。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多