【发布时间】:2018-01-11 03:03:00
【问题描述】:
检票口使用模型可能很麻烦。要使有状态页面正确呈现对象,您需要使用大量样板代码、重写类以正确获取可见性状态等......一个简单的例子:
private IModel<FooBar> fooBarModel;
public MyPage() {
Label lbl1 = new Label("field1",
new PropertyModel<>(fooBarModel, "field1")) {
@Override public boolean isVisible() {
return fooBarModel.getObject().someCondition();
} }
add(lbl1);
/// Etc... same for dozen of other fields
}
我经常使用ListView 来提供帮助。同样的例子:
public MyPage() {
add(new ListView<FooBar>("content",
new SingleListModel<FooBar>(fooBarModel)) {
@Override protected void populateItem(...) {
FooBar fooBar = item.getModelObject();
// Code here gets simpler:
Label lbl1 = new Label("field1", fooBar.getField1());
lbl1.setVisible(fooBar.someCondition());
item.add(lbl1);
// Etc...
}
});
}
使用简单的实用程序类SingleListModel,将IModel<T> 转换为ListModel<T>,具有1 个或0 个元素,具体取决于T 是否为空:
public class SingleListModel<T>
extends LoadableDetachableModel<List<T>> {
private IModel<T> tModel;
public SingleListModel(IModel<T> tModel) {
this.tModel = tModel;
}
@Override
protected List<T> load() {
List<T> ret = new ArrayList<>(1);
T t = tModel.getObject();
if (t != null)
ret.add(tModel.getObject());
return ret;
}
}
这样做的好处是,如果fooBarModel 返回null,标记中的整个“内容”元素将被隐藏;无需特殊处理。
但这一切对我来说都像是一种黑客行为,因为我以某种“不自然”的方式使用 ListView。
有没有更简洁的方法来获得相同的结果?标准检票口框架?
【问题讨论】:
-
我投票结束这个问题,因为关于工作代码的问题属于Code Review。
-
@Michael 我不这么认为。它看起来对我来说是合法的。
-
@soorapadman “有什么好的方法来做 X?”是基于意见的。
-
我并不是真的在问“做 X 的好方法”,而是“比 X 更干净的方法”,X 是一个 hack。
标签: java frameworks wicket