关闭模态窗口后,Apache Wicket Panel的TextFields不会刷新

时间:2016-11-25 07:54:53

标签: apache model-view-controller wicket wicket-6

我有一个用例,其中模态对话框有三组复选框地址(地址A,地址B,其他地址),每个地址类型划分为不同的div,供用户选择一个地址。

每种地址类型都有自己的一组TextFields,用于显示姓名,房屋号码,街道,城市,邮政编码和国家/地区。

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

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

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

我还在这里粘贴了相关的代码部分。请求任何可以指导我在哪里出错的地方以及我需要更正的地方,以便在点击" OK'时刷新子面板文本字段。莫代尔的按钮。

提前致谢

--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);
                }

1 个答案:

答案 0 :(得分:0)

您正在创建一个新的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();
    }
}));

否则,您只会拔出一次名称,并且在模型发生变化时永远不会更新。