gpt4 book ai didi

design-patterns - Wicket "nullable"组件 View

转载 作者:行者123 更新时间:2023-12-02 05:07:45 25 4
gpt4 key购买 nike

我经常使用自定义 Wicket 组件来渲染模型对象。对象有时可以为空,在这种情况下会显示特定的 div。因此,在组件 HTML 呈现代码中,我有两个 div,一个用于“空”情况,一个用于“非空”情况,以及其他一些内部标记。一个被显示,而另一个被屏蔽。

<div wicket:id="toDisplayWhenObjectIsNull">
...
</div>
<div wicket:id="toDisplayWhenObjectIsNotNull">
<span wicket:id="label">...</span>
<table wicket:id="table">...</table>
...
</div>

我面临的问题是 Wicket 强制我完全构建两个 div,即使模型对象为空。在对子组件构建(标签、表格等)的所有调用中,我必须检查是否为空,这既麻烦又容易出错:
X myX = getModel().getModelObject();
Label label = new Label("label",
myX == null ? null : formatY(myX.getY()));

对此的第一个解决方案是将非空部分拆分为特定的 Wicket 口子组件,无论是作为它自己的类还是主组件的内部类;并插入此组件来代替“非空”div。但这使所需文件(资源、HTML、Java 代码)的数量翻了一番。这并不理想。

第二种解决方案是通用的,将创建一个“装饰器”组件来封装任何其他组件,并检查其模型对象上的空值。如果组件为空,那么它会显示一个标准的 div,如果不是,它将依赖于被装饰的组件。我尝试使用边框或复合面板来实现这一点,但我无法让它发挥作用。我想要实现的是这样的:
// Client code, Java
ViewXPanel xpanel = new ViewXPanel("xpanel", new Model<X>(x));
add(xpanel);

// HTML
<div wicket:id="xpanel"/>

或者,如有必要,让客户端负责显示组件的“可空性”,在客户端代码中使用类似这样的内容:
// Client code, Java
ViewXPanel xpanel = new NullableDecorator(?, ViewXPanel(...));
add(xpanel);

最佳答案

为了能够显示空值,我做了我自己的 Label 子类,在其中我覆盖了 onComponentTagBody()用占位符替换空字符串:

/**
* Since the converter is not invoked for null values, override this so that
* empty string can be replaced with null display value.
*/
@Override
public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
{
String value = getDefaultModelObjectAsString();
replaceComponentTagBody(markupStream, openTag,
value.isEmpty()? "N/A": value);
}

这将使得可以使用
// Client code, Java
add(new MyLabel("label");

// HTML
<div wicket:id="label"/>

当然,您必须根据自己的本地化偏好等进行自定义,但我希望您从提供的示例中了解全局。

关于design-patterns - Wicket "nullable"组件 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9128309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com