【问题标题】:wicket ListView with TextField in a form表单中带有 TextField 的检票口 ListView
【发布时间】:2013-11-11 10:10:21
【问题描述】:

我创建了一个CustomListView,其中一部分是一个TextField,我想在其中设置实体Issue的值:

customListView = new ListView<Issue>("fields", issuesModel) {
        @Override
        protected void populateItem(final ListItem<Issue> item) {
        Issue issue = item.getModelObject();
        item.add(new label("name", issue.getName()));
        TextField<String> customTextField = new TextField("customTextField", new PropertyModel<String>(issue, "value"));
         item.add(customTextField);}}

然后我有另一个类,我在其中添加了这个 ListView 组件的表单,并且每个问题都有几个 TextField,我可以在其中写入值:

IModel<List<Issue>> issuesModel = new CompoundPropertyModel<List<Issue>>(issueValues) {
        @Override
        public List<Issue> getObject() {

            issueValues = new ArrayList<Issue>();
            Issue issue;
            for (BasicIssue basicIssue : basicIssuesList) {
                issue = new Issue();
                issue.setName(basicIssue.getname());
                issueValues.add(issue);
            }
            return issueValues;
        }
    };

customListView = new CustomListView("customListView", issuesModel);
editBasicIssueForm = new Form("form") {
        @Override
        protected void onSubmit() {
        basicIssue.setIssues(issueValues);
 };
editIssuesForm.add(customListView); 

当我为每个问题填写所有 TextField 时,只有最后一个值设置为最后一个问题。之前的所有 Issue 值都是 NULL; 不知道是什么问题。

我的基本问题如下:

    @Entity
public class BasicIssue implements Serializable {
private Long id;
@OneToMany(cascade = CascadeType.ALL)
private List<Issue> issueList;
}

我之前可能遗漏了一些东西,但我使用 customListView 中的 issuesModel 来设置问题的值。在表格中,我需要将此问题列表设置为 BasicIssue。但是列表是空的。

【问题讨论】:

    标签: listview wicket textfield


    【解决方案1】:

    我会说问题出在模型上。我会使用LoadableDetachableModel 而不是覆盖CompoundPropertyModel。然后实现方法load

     LoadableDetachableModel issuesModel = new LoadableDetachableModel() {
            protected Object load() {
                ArrayList<Issue> issueValues = new ArrayList<Issue>();
                for (BasicIssue basicIssue : basicIssuesList) {
                    Issue issue = new Issue();
                    issue.setName(basicIssue.getname());
                    issueValues.add(issue);
                }
                return issueValues;
            }
     };
    

    还要注意issueValues实际上是一个局部变量,所以不需要使用实例变量。这同样适用于 for 循环内的 issue

    【讨论】:

      【解决方案2】:
              final ListView<mappingListType> listPe = new ListView<mappingListType>("listPe",
                  mappingList) {
      
              private static final long serialVersionUID = 1L;
      
              @Override
              protected void populateItem(ListItem<mappingListType> item) {
      
                  CompoundPropertyModel<mappingListType> cmpdModel = new CompoundPropertyModel<mappingListType>(
                          item.getModelObject());
                  item.setModel(cmpdModel);
      
                  textField1 = new TextField<String>("textField1");
                  item.add(textField1);               
      
                  textField2 = new TextField<String>("textField2");
                  item.add(textField2);
      
      
              }
      
          };
      

      这是我的应用程序的一个简单工作示例,它显示了 CompoundPropertyModel 将如何
      映射到组件并显示所需的信息(在您的情况下为 textField)。

      希望它也能帮助您理解您的问题。

      【讨论】:

      • 感谢您的回答。是的,它将与 CompondPropertyModel 一起使用,但我之前错过了一些东西,所以我错了。我的代码也在工作。 BasicIssueList 由 Project 实体填充,该实体由 Ajax 在同一页面加载,因此列表为空。我只需要在 AjaxFormComponentUpdatingBehavior 中填写 issueList,onUpdate。
      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多