2010-02-05 2 views
8

나는 AjaxPagingNavigator가 있습니다. 기본적으로 특정 조건에서 AjaxPagingNavigator 페이지가 다시로드됩니다. 이 경우 목록에 두 개 이상의 페이지가있는 경우에만 탐색기를 렌더링하려고합니다.(개찰구) 아약스 응답시 가시성 변경

그래서 어디서나 AjaxPagingNavigator에서 가시성 조건을 확인하고 가시성을 활성화/비활성화하여 탐색기를 통해 업데이트 할 수 있도록 처리기를 연결할 수 있습니다. 아약스 보이거나 안 보여?

마크 업 :

<div wicket:id="mainWrap"> 
    <div wicket:id="navigator"/> 
    <div wicket:id="listWrap"> 
     <div wicket:id="list><!-- here be content --></div> 
    </div> 
</div> 

그래서 나는 "목록"과 자제와 함께 "네비게이터를"새로 고침 "mainWrap"를 갱신 아약스 이벤트가 있습니다.

이것은 모든 것을 유발하는 이벤트입니다.

protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
    List foo = null; // do work to get list 
    model.setFound(found); // update the model (thus updating "list") 
    target.addComponent(mainWrap); 
} 

편집 : 나는 네비게이터를 작성 후 모델을 업데이트 한 후

navigator.setVisibility(list.getPageCount() > 1); 

을 쓸 수 있습니다 알고 있지만, 나는 AjaxPagingNavigator의 서브 클래스에서 그를 캡슐화 기대했다. 내가 개찰구를 만진 이후

답변

16

같은이 재정의 isVisible 방법으로 비용이 계산을하고주의하십시오.

일반적으로이 문제를 해결하는 가장 좋은 방법은 onConfigure을 무시하고 수동으로 공개 플래그를 설정하는 것입니다.

@Override 
void onConfigure() { 
    super.onConfigure(); 
    setVisible(isVisible() && someExpensiveToCalculateCondition); 
} 

onConfigure은 (onBeforeRender 만 표시 요소에 대한 호출 동안) 눈에 보이지 않는 것을 포함하여, 모든 성분에 대한 요청 처리 중에 한번만 호출 및 호출된다.

+0

나는이 답을 매우 좋아한다.앞으로이 문제를 너무 많이 부활시켜 주셔서 감사합니다. –

+0

+1 -이 하나의 생명의 은인 (두 표를받을 가치가 있습니다 :). 그러나 "onConfigure"에서 "isVisible"을 호출하는 이유는 무엇입니까? Dmitriy의 예제를 사용하면 첫 번째 아약스가 "someExpensiveToCalculateCondition"에 대해 "false"를 반환하고 두 번째가 "true"를 반환하면 "isVisible"은 전체 표현식을 거짓으로 간주합니다. –

+0

Eduardo, 이것은 분명히 유스 케이스에 달려 있습니다. 하나는 일반적으로 onVisible()을 호출하여 onConfigure 체인의 가시성 변경을 존중합니다. – msparer

1

그것은 잠시왔다,하지만 메모리 역할을하는 경우 :

당신은 당신이 원하는 조건에서, 같은 그것을 만 표시하여 "네비게이터"개체의에서 IsVisible() 메소드를 오버라이드 (override) 할 수 없습니다?

개찰구가 실수 할 수있는 전화를 계산 요청하지 당 isVisible 여러 번 호출로

.addComponent(new AjaxPagingNavigator(...) { 
    @Override public boolean isVisible() { 
    return model.getFound().size() > 25; 
    } 
}); 
+0

하! 나는 너무 어리 석다. 여기에서는 모든 종류의 미친 행동을 통해 가시성을 설정하고 설정했습니다. 오우! BTW "return super.isVisible() && this.getPageable(). getPageCount()> 1;" 다른 사람이 우리를 보이지 않게하기를 원한다면 우리는 그것을 존중하기를 바랍니다. –

+2

바보 같은 생각하지 마라. 내가 Wicket 어플리케이션을 개발할 때, 나는 보통 여러 가지 문제에 대한 해결책을 찾기 위해 많은 시간을 보냈다. 그리고 발견했을 때 그들은 내가 예상했던 것보다 훨씬 더 단순했다. –

+2

나는 그것을 두 번째로 할 것이다. 나는 Wicket 개발자들이 훌륭한 일을 해냈다고 생각한다. 보통 문제를 들여다 보면 해결하기 쉽고 수정하기가 쉽고 직관적이라고 생각했기 때문이다. – Matt