Wicket 6 AjaxFormComponentUpdatingBehavior事件在ListView的第一行上工作但不适用于后续的

时间:2013-11-30 22:38:32

标签: ajax wicket

我正在尝试在listView中处理DropDownChoice onchange事件,该事件可以显示模态窗口。它似乎适用于第一个元素,但不适用于后续添加的元素。

final ModalWindow modal = new ModalWindow("modal");
modal.setOutputMarkupId(true);
form.add(modal);

final ListView<CommandeFournisseurDetails> myView = new     ListView<CommandeFournisseurDetails>(
            "rowsList",
            new PropertyModel<List<CommandeFournisseurDetails>>(this,
                    "rows")) {
        @Override
        protected void populateItem(
                final ListItem<CommandeFournisseurDetails> item) {

            final CommandeCollectionJDBC myCollection = new CommandeCollectionJDBC();
            CommandeFournisseurDetails row = item.getModelObject();

            item.add(new Label("index",
                    new AbstractReadOnlyModel<Integer>() {
                        @Override
                        public Integer getObject() {
                            return item.getIndex() + 1;
                        }
                    }));

                    final DropDownChoice<String> ID_PRODUIT = new DropDownChoice(
                    "ID_PRODUIT", new PropertyModel<String>(row,
                            "ID_PRODUIT"), myCollection.getProduit());
            ID_PRODUIT.setOutputMarkupId(true);
            ID_PRODUIT.setMarkupId("ID_PRODUIT");
            ID_PRODUIT.setLabel(Model.of("Produit"));
            ID_PRODUIT.setRequired(true);

            AjaxFormComponentUpdatingBehavior behavior = new AjaxFormComponentUpdatingBehavior(
                    "onChange") {
                protected void onUpdate(AjaxRequestTarget target) {
                    if (!ID_PRODUIT.getDefaultModelObjectAsString()
                            .isEmpty()) {
                        final PageParameters params = new PageParameters();
                        params.set("message",
                                ID_PRODUIT.getDefaultModelObjectAsString());
                        params.set("type", "Produit");

                        modal.setPageCreator(new ModalWindow.PageCreator() {
                            public Page createPage() {
                                // Use this constructor to pass a reference
                                // of this page.
                                return new ModalContentPage(modal, params);
                            }
                        });

                        modal.show(target);

                        target.add(modal);

                        target.add(ID_PRODUIT);
                    }

                }

                protected void onError(AjaxRequestTarget target,
                        RuntimeException e) {
                    System.out.println(e.toString());
                }

            };
            ID_PRODUIT.add(behavior);

                            AbstractSubmitLink remove = new SubmitLink("removeRowLink") {
                @Override
                public void onSubmit() {
                    getList().remove(item.getModelObject());
                    getParent().getParent().removeAll();

                };
            }.setDefaultFormProcessing(false);

            item.add(remove);

        }
    }.setReuseItems(true);

    form.add(new SubmitLink("addRowLink") {
        @Override
        public void onSubmit() {
            rows.add(new CommandeFournisseurDetails());
        }
    }.setDefaultFormProcessing(false));

    myView.setOutputMarkupId(true);

    form.add(myView);

知道其他元素为什么不继承相同的事件? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

所有ID-PRODUIT下拉菜单(第一个,但其余的)都有相同的markupId,这要归功于:

ID_PRODUIT.setMarkupId("ID_PRODUIT");

尝试给他们一个独特的MarkupId。也许通过添加listitem的索引:

ID_PRODUIT.setMarkupId("ID_PRODUIT" + item.getIndex());

或完全删除该行代码。