Apache Wicket Panel 的 TextFields 在关闭 Modal 后不刷新 Window

Apache Wicket Panel's TextFields dont refresh after closing the Modal Window

我有一个用例,其中模态对话框具有三组复选框地址(地址 A、地址 B、其他地址),每个地址类型分为单独的 div,供用户 select 一个地址.

每种地址类型都有自己的一组文本字段,用于显示姓名、门牌号、街道、城市、邮政编码和国家/地区。

到目前为止一切顺利。我能够处理地址的 selection 并将文本字段值传递给模型。该模型正在反映 selected 地址。

点击 Modal Window 的 "OK" 按钮,(AjaxLink),有一个子面板(在另一个主面板下,其中包含所有地址只读文本字段),其中包含显示 selected 地址类型。但它没有得到刷新。但是文本字段模型具有更新的值。 (我在调试时发现了这个)

已尝试过此网站上的所有内容: - 使用 LoadableDetachableModel、setDefaultModel()、创建面板的新实例等,但没有任何用处

我也把相关的代码部分贴在这里了。请求任何人在这里指导我出了什么问题以及我需要更正的地方,以便在单击模式的“确定”按钮时刷新子面板文本字段。

提前致谢

--ShipmentAddressSelectedPanel constructor Code
  public ShipmentAddressSelectedPanel(String id, IModel<OrderDTO> orderDTOIModel) {
    super(id, orderDTOIModel);
    name = orderDTOIModel.getObject().getDeliveryAddress().getName();
    streetAddress = subOrderDTOIModel.getObject().getDeliveryAddress().getStreet();
    floor = orderDTOIModel.getObject().getDeliveryAddress().getFloor();
    postalNumber = orderDTOIModel.getObject().getDeliveryAddress().getZipCode();
    city = orderDTOIModel.getObject().getDeliveryAddress().getCity();
    add(new TextField<>("name", new LoadableDetachableModel<String>() {
        @Override
        protected String load() {
            return "" + name;
        }
    }));
    add(new TextField<>("streetAddress", new LoadableDetachableModel<String>() {
        @Override
        protected String load() {
            return "" + streetAddress;
        }
    }));
    add(new TextField<>("floor", new LoadableDetachableModel<String>() {
        @Override
        protected String load() {
            return "" + floor;
        }
    }));
    //floor
    add(new TextField<>("postalNumber", new LoadableDetachableModel<String>() {
        @Override
        protected String load() {
            return "" + postalNumber;
        }
    }));
    //postalNumber
    add(new TextField<>("city", new LoadableDetachableModel<String>() {
        @Override
        protected String load() {
            return "" + city;
        }
    }));

}

--code of onClick of AjaxLink ("Ok") button
add(new AjaxLink("saveAddress") {
        @Override
        public void onClick(final AjaxRequestTarget target) {
            if (addressA.getValue().equals("true"))
            {
                onSaveAddress(target, getShipmentAddressModelFromDeliveryAddress(addressAModel.getObject()));
            }

--Code of onSaveAddress where the logic refresh Panel is called from the main panel
@Override
public void onSaveAddress(AjaxRequestTarget target, ShipmentAddressModel shipmentAddressModel) {

                    ShipmentAddressSelectedPanel newShipmentAddressSelectedPanel = new ShipmentAddressSelectedPanel("showShipmentAddressSelected", orderDTOIModel);
                    newShipmentAddressSelectedPanel.setOutputMarkupId(true);
                    //newShipmentAddressSelectedPanel.setDefaultModelObject(orderDTOIModel);
                    target.add(newShipmentAddressSelectedPanel);
                    showAddressModal.close(target);
                }

您正在创建一个新的 ShipmentAddressSelectedPanel,但它没有添加到组件树中。 请注意,AjaxRequestTarget 会跳过不在当前页面内的组件。您应该有一个日志条目:

"Component .. with markupid: .. not rendered because it was already removed from page"

注意你对 LDM 的用法是错误的,应该是:

//name = orderDTOIModel.getObject().getDeliveryAddress().getName();
add(new TextField<>("name", new LoadableDetachableModel<String>() {
    @Override
    protected String load() {
        return orderDTOIModel.getObject().getDeliveryAddress().getName();
    }
}));

否则您将只提取一次名称,并且在模型更改时永远不会更新。