我想基于日期创建搜索。 我尝试了很多不同的方法来重新编写带有listview的Ajax表。 listview在我使用加载页面时工作正常 - 但是当试着将它添加到ajaxsubmit buttun时 - 我创建了例如-18新行创建的标记 - 但数据不存在。 那么问题是我如何在启用ajax的listview标签中添加数据?
===================
final ListView logTableListView = new ListView<SyslogParsed>("List"){
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<SyslogParsed> item) {
//SyslogParsed sp = item.getModelObject();
item.add(new Label("col1"));
item.add(new Label("col2" ));
item.add(new Label("col3") );
item.add(new Label("col4" ));
}
};
final PropertyModel<List<SyslogParsed>> sysLogPropertyModel = new PropertyModel<List<SyslogParsed>>(this, "Dao.findAll");
wmc.setOutputMarkupId(true);
wmc.add(logTableListView);
add(wmc);
logTableListView.setReuseItems(true);
sysLogSearchForm.add(new AjaxSubmitLink("submit"){
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
List<?> allLog = syslogParsedDao.findAll();
logTableListView.setList(allLog); logTableListView.modelChanged();
target.add(wmc);
}
});
===============
<table class="sortable" wicket:id="listContainer">
<tr>
<th> col 1</th>
<th> col2</th>
<th>col 3 </th>
<th> col 4</th>
</tr>
<tr wicket:id="List">
<td wicket:id="col1" > </td>
<td wicket:id="col2"> </td>
<td wicket:id="col3"> </td>
<td wicket:id="col4"> </td>
</tr>
</table>
</wicket:extend>
答案 0 :(得分:2)
首先检查你的ListView是否已分配模型(我认为是因为显示18行..)然后在你的populateItem中使用PropertyModel,例如
protected void populateItem(ListItem<SyslogParsed> item) {
SyslogParsed sp = item.getModelObject();
item.add(new Label("col1",new PropertyModel<SyslogParsed>(sp, "blabla1")));
item.add(new Label("col2",new PropertyModel<SyslogParsed>(sp, "blabla2") ));
item.add(new Label("col3",new PropertyModel<SyslogParsed>(sp, "blabla3")) );
item.add(new Label("col4",new PropertyModel<SyslogParsed>(sp, "blabla4") ));
}
你也可以使用CompoundPropertyModel
答案 1 :(得分:1)
我看不到您实际设置列表模型的位置。尝试首先实例化propertymodel,然后像
一样构造listviewnew ListView<SyslogParsed>("List", sysLogPropertyModel )
然后,属性模型将调用
在这个例子中 this.getDAO().getFindAll()
。因此,看起来您永远不会找到数据,而且listview没有任何modelobject,也不会通知任何更改。
您可以尝试使用类似
的AbstractReadonlyModelnew ListView<SyslogParsed>("List", new AbstractReadOnlyModel<SyslogParsed>() {
public SyslogParsed getObject() {
getSyslogparsedao().findAll();
}
});
并将listviews容器添加到submit方法中的ajaxrequesttarget。每次重新渲染视图时,都会调用模型getObject,并且listview将获取刷新的数据。
答案 2 :(得分:0)
我没有足够的回购投票你的答案 - 答案实际上解决了我的问题==这里我做了什么 -
AbstractReadOnlyModel<List<LogParsed>> emptyListModel = new AbstractReadOnlyModel<List<LogParsed>>(){
@Override public List<logParsed> getObject() {
List<logParsed> emptyList = new ArrayList<LogParsed>();
LogParsed sp = new LogParsed();
emptyList.add(sp); return emptyList;
} };
=====
final AbstractReadOnlyModel<List<LogParsed>> listModel = new AbstractReadOnlyModel<List<v>>()
{
@Override
public List<LogParsed> getObject() {
// TODO Auto-generated method stub
return LogParsed.findAll();
}
};
final ListView<logParsed> logTableListView = new ListView<logParsed>("logList",emptyListModel ){
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<logParsed> item) {
logParsed sp = item.getModelObject();
item.add(new Label("sdo somthing"," "+ sp.getdosomthing() ));
}
};
//wmc.setVisible(false);
wmc.setOutputMarkupId(true);
wmc.add(logTableListView);
add(wmc);
logTableListView.setList(new ArrayList<logParsed>());
//logTableListView.setReuseItems(true);
AjaxSubmitLink aj = new AjaxSubmitLink("submit"){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
logTableListView.setDefaultModel(listModel );
logTableListView.modelChanged();
target.add(wmc);
}
@Override
protected void onError(AjaxRequestTarget arg0, Form<?> arg1) {
// TODO Auto-generated method stub
}
};
logSearchForm.add(aj);
return logSearchForm;
}
====
当你创建列表视图时,诀窍就是这个 - 你必须定义如何创建重复项 - 因此,当您在ajaxsubmit中更改模型时 - 重复元素可以遵循先前的模式。
希望有人会觉得这个答案很有用