代码之家  ›  专栏  ›  技术社区  ›  martin

Tapestry:来自Palette组件的事件

  •  1
  • martin  · 技术社区  · 11 年前

    我在一个页面上使用调色板组件,我希望其中两个页面中的可用元素根据第一个页面中选择的内容而改变。

    实现这一目标的最佳方式是什么?哪些事件是由调色板组件引发的,我可以倾听、调整调色板的模型并执行区域更新?我以为它会奏效 the same way as for select components 这样做:

    void onValueChanged() {
        // do something
    }
    

    不幸的是,这不适用于调色板。

    我使用的是Tapestry 5.4-beta-6,但我想自早期版本以来,情况并没有发生太大变化。

    2 回复  |  直到 11 年前
        1
  •  0
  •   lance-java    11 年前

    我可能会用调酒来做这个。

    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();
       }
    }
    

    Java脚本

    function palleteChange(spec) {
       var field = $('#' + spec.id + '/select[1]');
       field.on('change', function() {
          var zoneManager = Tapestry.findZoneManagerForZone(spec.zone);
          var params = { value: field.val() };
          zoneManager.updateFromURL(spec.url, params);
       });
    }
    

    然后在代码中使用mixin

    <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();
    }
    

    看见 here 对于类似的混合物。

        2
  •  0
  •   martin    11 年前

    我终于使用了 didChange 元素与类似的混合元素,如 Observe mixin .我放了一个演示 Github 任何感兴趣的人。

    只需注意几点:

    • 我使用了5.4beta 6,它已经有了必要的客户端事件。
    • 我无法使用Tapestry javascript模块,所以我仍然使用javascriptSupport.addInitializerCall。
    • 剩下的问题是,使用区域更新更新第二个调色板将重置用户在该调色板中所做的任何更改,因为它们只保留在客户端(隐藏字段中)。我仍需要对此进行调查,但这不是最初问题的一部分。