簡體   English   中英

Wicket動態ListView-Ajax不會更新默認項

[英]Wicket dynamic ListView - default item won't get updated by Ajax

我有一個ListView,從顯示的一個項目開始,在其中每個新項目附加一個AjaxSubmitLink,效果很好。 在ListView中,我有兩個DropDownChoices,第一個通過AjaxFormComponentUpdatingBehavior觸發第二個的選擇。 這也可行,但前提是我將另一個項目添加到默認項目中。 如果未單擊AjaxSubmitLink,則不會更新第二個DropDownChoice,並且在Ajax調試窗口中,將有一個空格,而不是第一個DropDownChoice的ID。

這是我的代碼:

final MarkupContainer devicescontainer = new WebMarkupContainer("devicesContainer");
devicescontainer.setOutputMarkupId(true);
add(devicescontainer);   
final ListView devicesListView = new ListView<Device>("devices", devices) {

    @Override
    protected void populateItem(ListItem<Device> item) {
        item.setModel(new CompoundPropertyModel<Device>(item.getModel()));
        final List<Device.DeviceCategory> cats = Arrays.asList(Device.DeviceCategory.values());
        final DropDownChoice<Device.DeviceCategory> categoryDropDownChoice = new DropDownChoice<Device.DeviceCategory>("deviceCategory", cats);
        final DropDownChoice<Device.DeviceSubcategory> subcategoryDropDownChoice = new DropDownChoice<>("deviceSubcategory");
        categoryDropDownChoice.setOutputMarkupId(true);
        subcategoryDropDownChoice.setOutputMarkupId(true);

        categoryDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                List<Device.DeviceSubcategory> subcats = Device.getPotentialSubcategories(categoryDropDownChoice.getModelObject());
                subcategoryDropDownChoice.setChoices(subcats);
                target.add(subcategoryDropDownChoice);
        }});
        item.add(categoryDropDownChoice);
        item.add(subcategoryDropDownChoice);
    }
}.setReuseItems(true);
devicescontainer.add(devicesListView);

AjaxSubmitLink addDeviceLink = new AjaxSubmitLink("addDevice") {

    @Override
    public void onSubmit(AjaxRequestTarget target, Form form) {

        devicesListView.getModelObject().add(new Device(newId));
            if (target != null){
                target.add(devicescontainer);
            }
    }
};
addDeviceLink.setDefaultFormProcessing(false);
devicescontainer.add(addDeviceLink);

如何在不首先單擊“添加設備”鏈接的情況下使Ajax驅動的DropDownChoice工作?

編輯:所有元素的生成的ID是完整且唯一的。 ListView項沒有ID,如果有ID則無濟於事。

我已經將您的代碼發布到Wicket示例頁面中,並且可以立即運行。

請檢查您的標記,這對我來說效果很好:

<form wicket:id="form">
    <div wicket:id="devicesContainer">
        <div wicket:id="devices">
            <select wicket:id="deviceCategory"/>
            <select wicket:id="deviceSubcategory"/>
        </div>
        <a wicket:id="addDevice">+</a>
    </div>
</form>

事實證明,實際上是導致問題的公司JavaScript。 我相信它會在<select>上調用select2 jquery插件,這樣Ajax就會被覆蓋。 我只是刪除了整個腳本,現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM