2017-12-15 5 views
0

Innerhalb einer Tabellenzelle muss ich ein Wicket ExternalLink erstellen, das die Antwort in einem neuen Browser Tab zeigt. Ich habe diesen Code (Wicket 7.9) verwendet:Wicket: Wie erstellt man ExternalLink mit <a href="..." target="_blank">

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); 
    } 
}); 

Aber Wicket macht dies:
<div onclick="window.location.href='http://www.geodata.com/maps?service=WFS&amp;request=GetCapabilities';return false;" target="_blank">Caps</div>

Dies lässt sich nicht öffnen Sie einen neuen Tab.

Die Tabelle HTML-Markup wird von Wicket generiert, daher kann ich
<td><a wicket:id="link" href="..."></a></td> nicht in die entsprechende Markup einfügen.

Wie kann ich Wicket zum Rendern <a href=" ... " target="_blank">Caps</a> zwingen?

Alternativ, wie kann ich einen neuen Browser Tab erstellen, wenn ich nicht vermeiden kann, onClick (Javascript) zu verwenden?

Antwort

1

löste ich das Problem durch eine Verlängerung der Wickets Panel mit diesem einfachen Markup erstellen:

für den Link
<!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> 

Wegen <a wicket:id="link"> Wicket nicht Javascript erstellen.

Entsprechende 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"); 
      } 
     }); 
    } 
} 

Und in dem Code, der die Spalte der Tabelle erstellt:

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")); 
    } 
}); 
+2

Der Unterschied ist, dass Sie in Ihrer Frage verwenden, um ein 'div' statt' a'. Deshalb verwendet Wicket JavaScript. Auch das Attribut 'target' könnte im Markup –

+0

@ martin-g enthalten sein - der Link befindet sich in einer 'BootstrapDataTable'. Gibt es eine Möglichkeit, 'in meiner Implementierung von' populateItem' zu erstellen, ohne ein 'Panel' zu verwenden? – JimHawkins

+0

Ich habe gerade darauf hingewiesen, warum Ihr erster Versuch scheiterte. Vielleicht ist jemand in Zukunft gleich. Die Verwendung eines Fragments ist eine leichtere Lösung. Es ist auch möglich, nur mit 'onBeforeRender',' onComponentTag' und 'onAfterRender' zu arbeiten, aber es ist fraglich, ob es besser ist als Fragment/Panel. –