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
  • 剩下的问题是,使用区域更新更新第二个调色板将重置用户在此调色板中所做的任何更改,因为这些更改仅保留在客户端(隐藏字段中)。我仍需对此进行调查,但这不是原始问题的一部分

这看起来很有希望。我会尽快试一试的。谢谢更改事件不是正确的。然而,当使用t5:palette:didChange时,这种方法是有效的;5.4-beta-17现在可以使用(作为预览,投票即将到来),我不能诚实地说自从beta-6以来,那里发生了什么变化。客户端有很多功能,调色板组件生成willChange和didChange事件(包括对侦听器的否决权)。谢谢,我不知道。听起来很有希望。我去看看。我怎样才能赶上这些活动?我尝试了以下操作,但没有一个被调用:@OnEvent(value=“willChange”,component=“mypalete”),@OnEvent(value=“t5:palete:willChange”,component=“mypalete”)。我错过什么了吗?没有。。。willChange和didChange是客户端事件@OneEvent用于服务器端事件。您的索引页正在初始化其声明中的变量,您永远不应该这样做(例如
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();
}