动态修改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();
}
这样,表单元素的值被设置在服务器端,当你触发形式的注射剂,和你可以在注入事件处理程序中使用它。
我想避免假表单提交。你有任何其他想法,或者我应该改变我的方法吗? – ponzao 2010-06-07 10:43:27
@Ponzao:如果您没有将上下文绑定到FormInjector,然后修改其中存储的事件URL,您可能仍然可以使用上下文方法......但它不会很漂亮。 更好的选择可能是使用两种不同的形式:一种是提交加载区域内容,另一种是完全在区域内。如果在你的情况下这是可能的,那就是要走的路。 – Henning 2010-06-08 13:11:44
好的,谢谢,我还不知道要采取什么措施,但你的回答给了我足够的选择。 – ponzao 2010-06-11 07:53:44