通过ajax提交在列表视图中添加新项目

时间:2012-03-30 18:25:18

标签: java ajax listview wicket

我想基于日期创建搜索。 我尝试了很多不同的方法来重新编写带有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>

3 个答案:

答案 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,然后像

一样构造listview
new ListView<SyslogParsed>("List", sysLogPropertyModel )

然后,属性模型将调用

在这个例子中

this.getDAO().getFindAll()。因此,看起来您永远不会找到数据,而且listview没有任何modelobject,也不会通知任何更改。

您可以尝试使用类似

的AbstractReadonlyModel
new 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中更改模型时 - 重复元素可以遵循先前的模式。

希望有人会觉得这个答案很有用