2014-08-30 8 views
0

페이지에서 팔레트 구성 요소를 사용하고 있는데 두 개에서 사용 가능한 요소를 첫 번째 선택 요소에 따라 변경하고 싶습니다.Tapestry : Palette 구성 요소의 이벤트

이것을 달성하는 가장 좋은 방법은 무엇입니까? 팔레트 구성 요소에 의해 어떤 이벤트가 발생했는지, 청취 할 수 있는지, 팔레트 모델을 적용하고 영역 업데이트를 수행 할 수 있습니까?

void onValueChanged() { 
    // do something 
} 

불행하게도 팔레트 작동하지 않습니다 : 나는이 같은 the same way as for select components하고 뭔가를 일 거라 생각 했어요.

저는 Tapestry 5.4-beta-6을 사용하고 있습니다.하지만 이전 버전 이후로는 그다지 변함이 없습니다.

+1

몇 노트; 5.4-beta-17이 현재 사용 가능하며 (미리보기로 투표가 예정 됨) 베타 6 이후에 변경된 사항을 정직하게 말할 수 없습니다. 여기 클라이언트 측에는 많은 힘이 있습니다. 팔레트 구성 요소는 willChange 및 didChange 이벤트 (청취자에게 거부권을 포함하여)를 생성합니다. –

+0

고마워, 나는 그걸 몰랐다. 매우 유망한 것으로 들립니다. 제가 확인하겠습니다. – martin

+0

어떻게 이러한 이벤트를 잡을 수 있습니까? 다음을 시도했지만 그 중 아무 것도 호출되지 않습니다. @OnEvent (value = "willChange", component = "myPalette"), @OnEvent (value = "t5 : 팔레트 : willChange", component = "myPalette"). 내가 놓친 게 있니? – martin

답변

0

마지막으로 didChange 요소를 Observe mixin과 같은 유사한 믹스와 함께 사용했습니다. 관심이있는 사람은 Github에 데모를했습니다.

그냥 몇 가지 참고 사항 :

  • 나는 이미 필요한 클라이언트 측 이벤트가, 5.4 베타 6를 사용했다.
  • Tapestry 자바 스크립트 모듈을 사용하여 작동하도록 만들 수 없으므로 javascriptSupport.addInitializerCall을 계속 사용합니다.
  • 나머지 문제는 두 번째 팔레트를 영역 업데이트로 업데이트하면 사용자가이 팔레트에서 변경 한 사항이 재설정된다는 것입니다. 숨겨진 필드에서만 클라이언트 측에 유지되기 때문입니다. 나는 아직도 그것을 조사 할 필요가있을 것이다. 그러나 그것은 원래의 질문의 일부가 아니다.
+0

당신의 색인 페이지는 결코 선언 할 변수를 초기화하지 않습니다 (예 :'private list availableSubCategories = new ArrayList ()'). 이로 인해 한 요청에서 다른 요청으로 변수가 유출됩니다.대신 초기화 이벤트 (예 : setupRender() 또는 onPrepare())를 사용하십시오. –

0

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

자바 스크립트

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

그런 다음

@Inject 
private Zone myZone; 

Block onChangeFromMyPalette(String value) { 
    doStuff(value); 
    return myZone.getBody(); 
} 

비슷한 믹스 인을위한 here를 참조 코드

<t:palette t:id="myPalette" t:mixins="paletteChange" zone="myZone" ... /> 
<t:zone t:id="myZone"> 
    ... 
</t:zone> 

페이지의 믹스 인을 사용합니다.

+0

유망 해 보입니다. 나는 그렇게 빨리 시도 할 것이다. 감사! – martin

+0

change-event가 올바른 이벤트가 아닙니다. 그러나 t5 : palette : didChange를 대신 사용하면 접근 방식이 작동합니다. – martin