动态修改Tapestry 5中的FormInjector上下文信息

问题描述:

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

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

<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,但我不知道如何实现此目的。

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

使用上下文参数传递动态值不会是我的第一选择。 (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(); 
} 

这样,表单元素的值被设置在服务器端,当你触发形式的注射剂,和你可以在注入事件处理程序中使用它。

+0

我想避免假表单提交。你有任何其他想法,或者我应该改变我的方法吗? – ponzao 2010-06-07 10:43:27

+0

@Ponzao:如果您没有将上下文绑定到FormInjector,然后修改其中存储的事件URL,您可能仍然可以使用上下文方法......但它不会很漂亮。 更好的选择可能是使用两种不同的形式:一种是提交加载区域内容,另一种是完全在区域内。如果在你的情况下这是可能的,那就是要走的路。 – Henning 2010-06-08 13:11:44

+0

好的,谢谢,我还不知道要采取什么措施,但你的回答给了我足够的选择。 – ponzao 2010-06-11 07:53:44