0

我们正在编写一个重 AJAX 的 Wicket 应用程序,并且有面板通过renderHead(). 但是,当通过 AJAX 替换面板时 - 比如说,通过AjaxTabbedPanel,旧面板的标题贡献仍然存在并污染了应用程序的其余部分。除了响应膨胀之外,当 CSS 声明过于通用时,这会导致问题,从而导致应用程序的其他区域出现渲染问题。

有没有解决的办法?IHeaderReponse比如说,当面板被替换/不再可见时重新创建的机制?

对于它的价值,我们的标题贡献者的一个例子是:

@Override
public void renderHead(IHeaderResponse response) {
    response.renderCSSReference(new SharedResourceReference(SearchMainPanel.class, "Search.css"));
}

我们正在使用 Wicket 1.5.3。

<link rel="stylesheet" ... />我在面板标记中呈现 a 的自定义标签取得了成功<body>(即,不使用标题贡献者),但是 IE8 拒绝承认此 CSS 的存在 - 因此不得不重新考虑我们的策略。

4

1 回答 1

2

每个AjaxRequestTarget 都会收到一个专门针对该请求的新 IHeaderResponse。您看到的问题是由于先前的请求响应了您不再希望该页面出现的样式表。让浏览器忽略您已经在页面上呈现的样式表的唯一方法是在没有该文件的情况下重新呈现页面。

在这种情况下,您可以在第一次渲染每个选项卡时依赖样式级联,因为 Wicket 将在您渲染该面板时加载关联的样式表。但是,当您返回到以前呈现的选项卡(面板)时,Wicket 不会重新呈现样式表,因为它已经加载。这意味着您需要有一种方法来克服级联样式的限制。

最好的方法是给你的样式命名空间......这意味着你应该用一个命名空间类(如“tab1”或更准确的上下文)将每个面板包装在一个标签中,然后你将基于该类的所有样式:

.tab1 .heading {
    font-weight: bold;
}

.tab1 .description {
    background: blue;
}

.tab2 .heading {
    font-size: 1.3em;
}

.tab2 .description {
    background: lightblue;
}

这将确保您能够区分每个选项卡的单独样式,并且您可能需要的任何级联仍然适用于命名空间选择器

于 2012-06-15T18:14:52.790 回答