2011-07-01 1 views
0

일부 위젯 구성 요소의 경우 setOutputMarkupId(true)이라고 호출하면 렌더링 될 때 경고 메시지가 표시됩니다.최종 페이지에 어떤 Wicket 구성 요소의 태그가 렌더링 될지 예측하려면 어떻게해야합니까?

Markup id set on a component that is usually not rendered into markup. 

실제로는 HTML로 끝나는 모든 구성 요소의 ID를 테스트 용으로 찾을 수 있도록 출력하고 싶습니다. 클래스 또는 속성에서 setOutputMarkupId(true)이 합리적인지 여부를 어떻게 예측할 수 있습니까?


더 많은 세부 정보 - 내 Application에서 나는

페이지의 예를 들어
protected void init() { 
    super.init(); 
    addComponentInstantiationListener(new IComponentInstantiationListener() { 
     public void onInstantiation(Component component) { 
      if (!(component instanceof WebMarkupContainer)) return; 
      if (component instanceof WebMarkupContainerWithAssociatedMarkup) return; 
      if (component instanceof Border.BorderBodyContainer) return; 
      WebMarkupContainer container = (WebMarkupContainer) component; 
      if (container.isTransparentResolver()) return; 

      component.setOutputMarkupId(true); 
     }}); 

이 임의의 gubbins 트릭을 수행 무시 해요,하지만 꽤 임의 보인다!

+0

분명히 내가 해결하려고하는 문제의 세부 사항을 알지 못하지만 이것이 좋은 생각이라고 확신합니까? 고유 한 ID로 모든 것을 표시하지 않고 쉽게 xpath를 사용할 수 있습니다. – biziclop

답변

1

DataViewListView과 같은 리피터 구성 요소에는 자체 마크 업이 없지만 Item으로 마크 업을 반복합니다. 구성 요소가 instanceof RepeatingView인지 확인할 수 있습니다.

이 문제

쉽게 다음과 같은 잘못, 예를으로 표시됩니다 : 여기

ListView<Person> people = new ListView<Person>("people", list) { 
    protected void onPopulateItem(ListItem<Person> item) { 
     add(new Label("name", item.getModelObject().getName())); 
    } 
} 

우리는 목록 항목에 레이블을 추가, 오히려 목록보기하지 않습니다. 그리고 그것은 실패합니다. 코드는 다음과 같아야합니다.

ListView<Person> people = new ListView<Person>("people", list) { 
    protected void onPopulateItem(ListItem<Person> item) { 
     item.add(new Label("name", item.getModelObject().getName())); 
    } 
} 
+0

'instanceof RepeatingView' 만 확인하면 경고의 절반을 제거하는 것처럼 보이지 않습니다. 내가 검사해야 할 훌륭한 일반 슈퍼 클래스가 있습니까? –

1

자동 구성 요소 (Component.isAuto())도 무시해야합니다. 이러한 구성 요소는 예를 들면 <wicket:container>, <wicket:enclosure> 등입니다.

1

이것은 좋은 아이디어입니다. 나는 이것을 시도하지 않았다. 지금은 할 수 없다. ...

WicketTag (렌더링되지 않았거나 적어도 무엇인가)에 연결되는지 여부를 확인하여 적절히 렌더링되는 구성 요소를 찾을 수있다. 이 메시지를 일으키는 원인).

는 다음과 같이 수행 할 수 있습니다

boolean isGoingToBeRendered (Component component) { 
    MarkupStream stream = new MarkupStream(component.getMarkup()); 
    ComponentTag tag = stream.getTag(); 
    return (!tag instanceof WicketTag); 
} 

을 다시이 어떤 노력 솔루션이 편집기에 해킹 코드의 단지 몇 줄되지 않습니다. 이 코드는 바로 사용할 수있는 코드가 아닌 포인터로 사용됩니다.