【问题标题】:Tapestry: Events from Palette componentTapestry:来自 Palette 组件的事件
【发布时间】:2014-08-30 05:49:07
【问题描述】:

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

实现这一目标的最佳方法是什么?调色板组件抛出哪些事件,我可以收听、调整调色板的模型并执行区域更新?我认为它会工作the same way as for select components 做这样的事情:

void onValueChanged() {
    // do something
}

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

我正在使用 Tapestry 5.4-beta-6,但我想与早期版本相比,情况并没有太大变化。

【问题讨论】:

  • 只是一些笔记; 5.4-beta-17 现已推出(作为预览版,即将投票),老实说,我不能说自 beta-6 以来那里发生了什么变化。这里的客户端有很多权力,Palette 组件产生 willChange 和 didChange 事件(包括对侦听器的否决权)。
  • 谢谢,我不知道。听起来很有希望。我去看看。
  • 我怎样才能捕捉到这些事件?我尝试了以下方法,但没有一个被调用:@OnEvent(value="willChange", component="myPalette"), @OnEvent(value="t5:palette:willChange", component="myPalette")。我错过了什么吗?
  • 不... willChange 和 didChange 是客户端事件。 @OnEvent 用于服务器端事件。

标签: ajax tapestry palette


【解决方案1】:

我可能会用 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();
   }
}

Javascript

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 了解类似的mixin。

【讨论】:

  • 这看起来很有希望。我会尽快尝试的。谢谢!
  • 更改事件不是正确的。但是,该方法在使用 t5:palette:didChange 时有效。
【解决方案2】:

我终于将didChange 元素与Observe mixin 等类似的mixin 一起使用。我在Github 上为任何感兴趣的人提供了一个演示。

只是一些注意事项:

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

【讨论】:

  • 您的索引页面正在初始化您不应该做的声明中的变量(例如private List&lt;String&gt; availableSubCategories = new ArrayList&lt;String&gt;())。这将导致变量从一个请求流向另一个请求。使用渲染事件代替初始化(例如 setupRender() 或 onPrepare())。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多