【问题标题】:Wicket: how to create ExternalLink with <a href="..." target="_blank">Wicket:如何使用 <a href="..." target="_blank"> 创建 ExternalLink
【发布时间】:2017-12-15 15:35:50
【问题描述】:

在表格单元格中,我必须创建一个 Wicket ExternalLink,以在新的浏览器选项卡中显示响应。 我用过这段代码(Wicket 7.9):

columns.add(new AbstractColumn<WebService, String>(Model.of(" "))
{
    @Override
    public void populateItem(Item<ICellPopulator<WebService>> cellItem, String componentId,
            IModel<WebService> serviceModel)
    {
        WebService ows = serviceModel.getObject();
        String url = "http://www.geodata.com/map?service=WMS&request=GetCapabilities";
        ExternalLink capabilitiesLink =
                new ExternalLink(componentId, Model.of(url), Model.of("Caps"))
                {
                    @Override
                    protected void onComponentTag(ComponentTag tag)
                    {
                        super.onComponentTag(tag);
                        tag.put("target", "_blank");
                    }
                };
        cellItem.add(capabilitiesLink);
    }
});

但是 Wicket 会呈现这个:
&lt;div onclick="window.location.href='http://www.geodata.com/maps?service=WFS&amp;amp;request=GetCapabilities';return false;" target="_blank"&gt;Caps&lt;/div&gt;

这不会打开一个新标签。

表格 HTML 标记是由 Wicket 生成的,所以我无法在相应的标记中插入
&lt;td&gt;&lt;a wicket:id="link" href="..."&gt;&lt;/a&gt;&lt;/td&gt;

如何强制 Wicket 渲染 &lt;a href=" ... " target="_blank"&gt;Caps&lt;/a&gt;

或者,当我无法避免使用onClick (Javascript) 时,如何创建新的浏览器选项卡?

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    我通过使用这个简单的标记创建 Wickets Panel 的扩展解决了这个问题:

    <!DOCTYPE html>
    <html xmlns:wicket="http://wicket.apache.org">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    <wicket:panel>
        <a wicket:id="link"></a>
    </wicket:panel>
    </body>
    </html>
    

    因为&lt;a wicket:id="link"&gt; Wicket 没有为链接创建 Javascript。

    对应的Java:

    public class LinkTargetBlankPanel extends Panel
    {
        private static final long serialVersionUID = -6527814402202345257L;
    
        public LinkTargetBlankPanel(String id, String url, String label)
        {
            super(id);
            add(new ExternalLink("link", url, label)
            {
                private static final long serialVersionUID = -8010560272317354356L;
    
                @Override
                protected void onComponentTag(ComponentTag tag)
                {
                    super.onComponentTag(tag);
                    tag.put("target", "_blank");
                }
            });
        }
    }
    

    在创建表格列的代码中:

    columns.add(new AbstractColumn<WebService, String>(Model.of(" "))
    {
        @Override
        public void populateItem(Item<ICellPopulator<WebService>> cellItem, String componentId,
                IModel<WebService> serviceModel)
        {
            String url = "http://www.geodata.com/map?service=WMS&request=GetCapabilities";
            cellItem.add(new LinkTargetBlankPanel("link", url, "GetCapabilities"));
        }
    });
    

    【讨论】:

    • 不同之处在于,在您的问题中,您使用的是div 而不是a。这就是 Wicket 使用 JavaScript 的原因。 target 属性也可以在标记中
    • @martin-g - 链接放在BootstrapDataTable 中。有没有办法在不使用Panel 的情况下在我的populateItem 实现中创建&lt;a href="..."&gt;
    • 我刚刚指出了您的第一次尝试失败的原因。将来可能会有人面临同样的情况。使用 Fragment 是一种更轻松的解决方案。也可以通过只处理onBeforeRenderonComponentTagonAfterRender 来做到这一点,但它是否会比 Fragment/Panel 更好是值得怀疑的。
    【解决方案2】:

    java:

    ExternalLink("link", new PropertyModel<>(model, "url"))
    

    html:

    <td><a target="_blank" wicket:id="link">Open</a></td>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多