我可能會用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);
});
}
然後用混入在你的代碼
<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();
}
一個類似的mixin見here。
只是幾個筆記; 5.4-beta-17現在可用(作爲預覽,即將投票),但我不能誠實地說自beta-6以來發生了什麼變化。這裏的客戶端有很多強大的功能,Palette組件產生willChange和didChange事件(包括對監聽者的否決權)。 – 2014-09-02 19:02:26
謝謝,我不知道。聽起來很有希望。我會看看。 – martin 2014-09-03 09:05:46
我怎樣才能抓住這些事件?我嘗試了以下,但沒有一個被調用:@OnEvent(value =「willChange」,component =「myPalette」),@OnEvent(value =「t5:palette:willChange」,component =「myPalette」)。我錯過了什麼嗎? – martin 2014-09-08 09:52:19