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();
}
}));
否则您将只提取一次名称,并且在模型更改时永远不会更新。
我有一个用例,其中模态对话框具有三组复选框地址(地址 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();
}
}));
否则您将只提取一次名称,并且在模型更改时永远不会更新。