Ajax Tapestry:来自调色板组件的事件
我在一个页面上使用调色板组件,我希望其中两个组件中的可用元素根据第一个组件中选择的内容进行更改 实现这一目标的最佳方式是什么?调色板组件抛出哪些事件,我可以监听、调整调色板的模型并执行区域更新?我认为这样做会奏效:Ajax Tapestry:来自调色板组件的事件,ajax,tapestry,palette,Ajax,Tapestry,Palette,我在一个页面上使用调色板组件,我希望其中两个组件中的可用元素根据第一个组件中选择的内容进行更改 实现这一目标的最佳方式是什么?调色板组件抛出哪些事件,我可以监听、调整调色板的模型并执行区域更新?我认为这样做会奏效: void onValueChanged() { // do something } 不幸的是,这不适用于调色板 我使用的是Tapestry 5.4-beta-6,但我想自早期版本以来,情况并没有发生太大变化。我可能会使用mixin public class PaletteC
void onValueChanged() {
// do something
}
不幸的是,这不适用于调色板
我使用的是Tapestry 5.4-beta-6,但我想自早期版本以来,情况并没有发生太大变化。我可能会使用mixin
public class PaletteChange {
@Parameter
private String zone;
@InjectContainer
private Palette palette;
public void afterRender() {
Link eventLink = componentResources.createEventLink("change");
JSONObject args = new JSONOBject(
"id", pallete.getClientId(),
"url", eventLink,
"zone", zone
);
javascriptSupport.addScript("palleteChange(%s)", args);
}
Object onChange(@RequestParameter("value") String value) {
CaptureResultCallback<Object> callback = new CaptureResultCallback<Object>();
resources.triggerEvent("change", new String[] { value }, callback);
return callback.getResult();
}
}
然后在代码中使用mixin
<t:palette t:id="myPalette" t:mixins="paletteChange" zone="myZone" ... />
<t:zone t:id="myZone">
...
</t:zone>
请参阅以获得类似的mixin。我最终使用了
didChange
元素和类似的mixin,如。我为任何感兴趣的人放了一个演示
请注意:
- 我使用了5.4 beta 6,它已经有了必要的客户端事件
- 我无法使用Tapestry javascript模块使其工作,因此我仍然使用javascriptSupport.AddInitializeCall
- 剩下的问题是,使用区域更新更新第二个调色板将重置用户在此调色板中所做的任何更改,因为这些更改仅保留在客户端(隐藏字段中)。我仍需对此进行调查,但这不是原始问题的一部分
private List availableSubCategories=new ArrayList()
)。这将导致变量从一个请求泄漏到另一个请求。改为使用渲染事件进行初始化(例如setupRender()或onPrepare()。
<t:palette t:id="myPalette" t:mixins="paletteChange" zone="myZone" ... />
<t:zone t:id="myZone">
...
</t:zone>
@Inject
private Zone myZone;
Block onChangeFromMyPalette(String value) {
doStuff(value);
return myZone.getBody();
}