加载模型失败时在渲染阶段更改组件的内容

Change Component's content during rendering phase when loading its model fails

我有一个像这样的简单标记继承的小部件组件

抽象小部件

<wicket:panel>
    <wicket:child />

    <div wicket:enclosure="editButton" class="widget-edit-wrapper">
        <button wicket:id="editButton" type="button" class="widget-edit">
            <span class="glyphicon glyphicon-cog"></span>
        </button>
        <div style="display:none;">
            <div wicket:id="editPanel" class="widget-settings"></div>
        </div>
    </div>
</wicket:panel>

LabelWidget

<wicket:extend>
    <div wicket:id="container" class="label-widget flex-container">
        <div wicket:id="label"></div>
    </div>
</wicket:extend>

现在假设标签内容取自可加载的可拆卸模型并且加载该模型会引发异常。

我需要就此 'broken' 小部件组件向用户显示一些反馈。有没有办法在加载模型抛出异常时替换整个 child 的内容?

注意 LabelWidget 只是众多 AbstractWidget child 中的一个,所以我需要在 AbstractWidget 中解决这个问题,我还需要保留来自AbstractWidget 组件。

您可以通过使用更智能的模型来实现此目的 - 一种委托给原始模型的模型,try/catches 如果它抛出异常。如果出现异常,您将需要 return 一个 "empty" 模型对象,其中 "empty" 对于不同的用例意味着不同的东西。

您的智能模型可以实现 IComponentAssignedModel,以便它知道使用它的 Component。这样您可以在 catch 子句中执行 component.error("...")。在 AbstractWidget 中,您应该添加一个 FeedbackPanel 来呈现错误消息。专业化小部件,如 LabelWidget,将通过使用回退模型呈现为 "empty"(无论这对它意味着什么)。