2017-03-21 5 views
0

예를 들어 간단한 개체에서 속성 값을 선택하는 경우가 종종 있습니다.개찰구에서 선택 렌더러를 자동으로 분리

public class Customer { 
    private Integer customerSiteId; 
} 

public class CustomerSite { 
    private Integer id; 
} 

나는 실제 개체의 목록을 가지고 있습니다. CustomerSite 클래스이지만, 내 선택은 정수를 기반으로합니다. 즉, 선택 사항은 사이트 ID에 해당하는 정수입니다.

내가 내부적 효율성

public class IdSelectionRenderer<T, S> implements IChoiceRenderer<T> { 

    IModel<Map<T, S>> displayMap; 

    public IdSelectionRenderer(IModel<Collection<S>> displays, Function<S, T> idObtainer) { 

     displayMap = new LoadableDetachableModel<Map<T, S>>() { 
      @Override 
      protected Map<T, S> load() { 
       return displays 
         .getObject() 
         .stream() 
         .collect(Collectors.toMap(idObtainer, Function.identity())); 
      } 
     }; 

    } 

    @Override 
    public Object getDisplayValue(T object) { 
     return displayMap.getObject().get(object); 
    } 

    @Override 
    public String getIdValue(T object, int index) { 
     return object.toString(); 
    } 

    @Override 
    public T getObject(String id, IModel<? extends List<? extends T>> choices) { 
     return Optional 
       .ofNullable(choices.getObject()) 
       .get() 
       .stream() 
       .filter(choice -> choice.toString().equals(id)) 
       .findFirst() 
       .orElse(null); 
    } 

} 

에 대해 별도의 모델을 생성 등의 사용 사례에 대한 IChoiceRenderer의 구현을 만들고 싶어 자동 개찰구가있는 내부의 엄격을 유지하면서 이러한 내부 모델을 분리 할 수있는 방법이 있나요 렌더러?

+0

구성 요소에 연결된 모델의 수명주기는 분리되어 있습니다. 연결되어 있지 않은 경우에는 연결하지 마십시오. 나는 당신을 이해할 수 없다. –

+0

컴포넌트에서 detach()를 오버라이드하여 분리하도록 선언 한 내부 모델을 연결할 수있다. 선택 렌더러에서 내부 모델을 연결하여 어떻게 든 분리 될 수 있는지 궁금합니다. 비헤이비어에는 자체 detach()가 있으므로 선택 렌더러에 비슷한 옵션이 있을지 궁금합니다. – WiseTree

답변

0

아니요, Wicket은 선택 렌더러를 분리하지 않으므로 모델을 연결할 수 없습니다. "수동으로"해야 할 것입니다.