我如何预测哪些Wicket组件将在最终页面中呈现它们的标记?

我如何预测哪些Wicket组件将在最终页面中呈现它们的标记?,wicket,Wicket,对于某些Wicket组件,如果我调用setOutputMarkupId(true),它们在渲染时会发出警告 Markup id set on a component that is usually not rendered into markup. 我想为每一个最终会出现在HTML中的组件输出一个id,以便我可以使用XPath找到它们进行测试。如何从组件的类或属性预测设置输出MarkupId(true)是否合理 更多详细信息-在我的应用程序中我正在覆盖 protected void init

对于某些Wicket组件,如果我调用
setOutputMarkupId(true)
,它们在渲染时会发出警告

Markup id set on a component that is usually not rendered into markup.
我想为每一个最终会出现在HTML中的组件输出一个id,以便我可以使用XPath找到它们进行测试。如何从
组件的类或属性预测
设置输出MarkupId(true)
是否合理


更多详细信息-在我的
应用程序中
我正在覆盖

protected void init() {
    super.init();
    addComponentInstantiationListener(new IComponentInstantiationListener() {
        public void onInstantiation(Component component) {
            if (!(component instanceof WebMarkupContainer)) return;
            if (component instanceof WebMarkupContainerWithAssociatedMarkup) return;
            if (component instanceof Border.BorderBodyContainer) return;
            WebMarkupContainer container = (WebMarkupContainer) component;
            if (container.isTransparentResolver()) return;

            component.setOutputMarkupId(true);
        }});

对于一个页面示例来说,这个任意的gubbins可以做到这一点,但它看起来确实非常任意

重复器组件,如
DataView
ListView
没有自己的标记,但使用
Item
s重复标记。您可以检查组件是否为RepeatingView的实例

这个问题很容易通过以下错误的示例显示出来:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        add(new Label("name", item.getModelObject().getName()));
    }
}
ListView人员=新建ListView(“人员”,列表){
PopulateItem(ListItem)上受保护的无效项{
添加(新标签(“名称”,item.getModelObject().getName());
}
}
这里我们不向列表项添加标签,而是向listview添加标签。但这失败了。代码应该是:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        item.add(new Label("name", item.getModelObject().getName()));
    }
}
ListView人员=新建ListView(“人员”,列表){
PopulateItem(ListItem)上受保护的无效项{
添加(新标签(“名称”,item.getModelObject().getName());
}
}

中继器组件,如
数据视图
列表视图
没有自己的标记,但使用
重复标记。您可以检查组件是否为RepeatingView的实例

这个问题很容易通过以下错误的示例显示出来:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        add(new Label("name", item.getModelObject().getName()));
    }
}
ListView人员=新建ListView(“人员”,列表){
PopulateItem(ListItem)上受保护的无效项{
添加(新标签(“名称”,item.getModelObject().getName());
}
}
这里我们不向列表项添加标签,而是向listview添加标签。但这失败了。代码应该是:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        item.add(new Label("name", item.getModelObject().getName()));
    }
}
ListView人员=新建ListView(“人员”,列表){
PopulateItem(ListItem)上受保护的无效项{
添加(新标签(“名称”,item.getModelObject().getName());
}
}

也忽略自动组件(Component.isAuto())。
这些组件例如:
,等等。

也忽略自动组件(Component.isAuto())。
例如:
,等等。

这只是一个想法。我没试过,现在不行

您可以通过检查组件是否绑定到WicketTag(未呈现的组件或至少是导致此消息的组件)来找到可能会呈现的组件

可以这样做:

boolean isGoingToBeRendered (Component component) {
    MarkupStream stream = new MarkupStream(component.getMarkup());
    ComponentTag tag = stream.getTag();
    return (!tag instanceof WicketTag);
}

再次声明:这不是一个尝试过的解决方案,只是一些代码被侵入了这个编辑器。它被定义为一个指针,而不是一段随时可用的代码。

这只是一个想法。我没试过,现在不行

您可以通过检查组件是否绑定到WicketTag(未呈现的组件或至少是导致此消息的组件)来找到可能会呈现的组件

可以这样做:

boolean isGoingToBeRendered (Component component) {
    MarkupStream stream = new MarkupStream(component.getMarkup());
    ComponentTag tag = stream.getTag();
    return (!tag instanceof WicketTag);
}

再次声明:这不是一个尝试过的解决方案,只是一些代码被侵入了这个编辑器。它被标识为指针,而不是现成的代码。

仅检查RepeatingView的
实例似乎不会删除一半警告。他们有什么好的泛型超类我应该检查吗?仅仅检查RepeatingView的
实例似乎并不能删除一半的警告。他们有什么好的泛型超类吗?显然我不知道你要解决的问题的细节,但是你确定这是个好主意吗?您可以轻松使用xpath,而无需使用唯一id标记所有内容。显然,我不知道您试图解决的问题的细节,但您确定这是一个好主意吗?您可以轻松地使用xpath,而无需使用唯一id标记所有内容。