在检票口中自动分离选择渲染器
Automatically detaching choice renderer in wicket
我经常发现自己在创建一个选择 select 一个简单对象上 属性 的值,例如
public class Customer {
private Integer customerSiteId;
}
public class CustomerSite {
private Integer id;
}
我有一个实际对象的列表,例如CustomerSite
class,但我的选择是基于整数的,即选择的是与站点ID对应的整数。
我想为此类用例实现 IChoiceRenderer
,它在内部创建一个单独的模型以提高效率
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);
}
}
有没有办法让 wicket 自动分离这些内部模型,同时将它们严格保留在渲染器中?
不,Wicket 不会分离选择渲染器,因此无法挂接您的模型。你将不得不这样做 "manually".
仅作记录:Wicket 8 修复了此问题:https://issues.apache.org/jira/browse/WICKET-6347
我经常发现自己在创建一个选择 select 一个简单对象上 属性 的值,例如
public class Customer {
private Integer customerSiteId;
}
public class CustomerSite {
private Integer id;
}
我有一个实际对象的列表,例如CustomerSite
class,但我的选择是基于整数的,即选择的是与站点ID对应的整数。
我想为此类用例实现 IChoiceRenderer
,它在内部创建一个单独的模型以提高效率
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);
}
}
有没有办法让 wicket 自动分离这些内部模型,同时将它们严格保留在渲染器中?
不,Wicket 不会分离选择渲染器,因此无法挂接您的模型。你将不得不这样做 "manually".
仅作记录:Wicket 8 修复了此问题:https://issues.apache.org/jira/browse/WICKET-6347