Wicket - Voeg body tag-attribuut toe

Ik zit vast -

Ik wil dat een Wicket Panel een class -kenmerk kan toevoegen aan de<body> tag of whatever page it's on. Example usage:

Java:

add(new SpecialSidebarComponent("sidebar"));

Gegenereerde HTML:

<body class="sidebar">
   ...
   <div id="sidebar">My Wicket Panel</div>
   ...
</body>

Ik kan geen wicket: id toevoegen en het lichaam een ​​Wicket-component maken, omdat dit het erg moeilijk maakt om componenten toe te voegen aan een pagina in de grote pagina-hiërarchie die ik heb, en het staat nog steeds niet eenvoudig toe dat een paneel de lichaamsattribuut.

Ik dacht dat BodyTagAttributeModifier hiervoor mogelijk is, maar blijkbaar is het voor iets anders en kan het niet laten functioneren ( Wicket: hoe gebruik je de klasse BodyTagAttributeModifier? )

Nuttige ideeën?

Bijwerken:

Als u ernaar kijkt, lijkt de klasse BodyTagAttributeModifier alleen te zijn voor de bovenliggende tag van een paneel, niet voor de pagina's.<body> tag:

Voorbeeld (Scala-syntaxis):

class Home extends WebPage {
  add(new Sidebar("sidebar"))
}
class Sidebar(id: String) extends Panel(id) {
  add(new BodyTagAttributeModifier("class", true, new Model("layout-class"), getParent))
}

Sjabloon:

<html>
<body>
    <div wicket:id="sidebar">Sidebar</div>
</body>
</html>

gesmolten:

<html>
<body>
    <div class="layout-class">
        

Hello World!

    </div>
</body>
</html>

Zeer verwarrende naam IMHO. Lost het probleem niet op, maar is in ieder geval logischer.

1

3 antwoord

Ik denk persoonlijk dat de Javascript-optie de schoonste is voor dit specifieke geval. Uw opmerking over toevoegen (Component ...) is echter definitief en doet vermoeden dat u mogelijk geïnteresseerd bent in de methode setTransparentResolver (true) . Dit is hoe het werkt...

BasePage.html

<body wicket:id="body">
    <div wicket:id="panel" />
</body>

BasePage.java

public class BasePage extends Page {

    public String bodyClass = "";

    public BasePage() {
       super();
       WebMarkupContainer bodyContainer = new WebMarkupContainer("body");
       bodyContainer.setTransparentResolver(true);
       bodyContainer.add(new SimpleAttributeModifier("class", new PropertyModel(this, "bodyClass")));
    }
}

MyPage.java (breidt BasePage uit)

public class MyPage extends BasePage {

    public MyPage() {
        super();
        add(new SidebarPanel("panel"));
        super.bodyClass = "sidebar";
    }
}

Ook al voeg je het SidebarPanel niet rechtstreeks toe aan de bodyContainer in de BasePage, het zal nog steeds werken vanwege setTransparentResolver (true) .

Voor uw eenvoudige geval, ga met Javascript. Voor het algemene probleem van het gevoel beperkt door subklassen die niet in containers passen, moet u rekening houden met transparant oplossen.

3
toegevoegd
Natuurlijk gaat dit ervan uit dat u niet gebruikt
toegevoegd de auteur jbrookover, de bron
Ervan uitgaande dat elke pagina BasePage uitbreidt, kunt u ((BasePage) getPage ()). BodyClass = ... doen. Ik heb dat zeker veel gedaan met aangepaste methoden op de basispagina.
toegevoegd de auteur jbrookover, de bron
Poster gaf aan dat een body -container het moeilijk maakt om componenten toe te voegen aan de pagina - vermoedelijk omdat je bodyContainer.add (...) als voorvoegsel moet gebruiken. Met een transparentResolver hoeft u dat niet te doen. Poster gaf ook aan dat hij een scenario met het type BasePage gebruikt. Ik heb dit veel gedaan met een dialoogvenster -type component met een verpakking container (een grens ) maar ik wil geen componenten aan een container toevoegen in een ouderklasse.
toegevoegd de auteur jbrookover, de bron
Het is zelden nuttig, maar echt gaaf als je het op de juiste manier kunt gebruiken. Ik vond het geweldig bij het maken van tientallen complexe dialogen met verschillende componenten, maar met hetzelfde frame. De FrameDialog had een root-container die een transparante resolver was en vervolgens AddTextDialog verlengt FrameDialog net toegevoegde componenten zoals "normaal".
toegevoegd de auteur jbrookover, de bron
Mooi voorbeeld, maar ik denk dat het OP het heeft over het wijzigen van de pagina 's <body> van een paneel erin, niet een < code> Pagina subklasse.
toegevoegd de auteur Xavi López, de bron
Nou, inderdaad, dat is de manier om te gaan, zoals ik ook heb opgemerkt in mijn opmerkingen. Ik snap nog steeds niet wat in dit voorbeeld bijdraagt ​​aan transparentResolver en subclassing.
toegevoegd de auteur Xavi López, de bron
Oh, geweldig, nu zie ik het, bedankt voor je opmerkingen :) +1, een transparante resolver is een goede keuze. Hoewel ik in dit geval een superklasse van BasePage zou maken die alleen de tag <body> en zou bevatten.
toegevoegd de auteur Xavi López, de bron
Cool :-) Wicket is zo, zo krachtig!
toegevoegd de auteur Xavi López, de bron

If you really can't give the <body> tag a wicket:id (I'll assume you don't have a BasePage that every, or almost every, other page extends in which to abstract this), it'll be not possible to know at page render time (when that <body> tag is rendered) what class to append to it, it will be simply copied as is from your HTML to the output.

U kunt echter hetzelfde via JavaScript doen. Maak uw Panel implementeer IHeaderContributor en gebruik IHeaderResponse.renderOnDomReadyJavscript() .

public abstract class SpecialSidebarComponent(String id) extends Panel 
                 implements IHeaderContributor {
    .....
    public void renderHead(IHeaderResponse response){
        String JavaScript = "document.body.setAttribute('class', 'sidebar');";
        response.renderOnDomReadyJavascript(javascript);
    }
    ....
}
2
toegevoegd
Bedankt voor het idee, had de Javascript aanpak niet overwogen - ziet er interessant uit. Op het andere punt - ik heb wel een basisklasse, maar met toevoegen (Component ...) is definitief, het is een pijn om componenten van subklassen toe te voegen, tenzij ik aangepaste nieuwe methoden zoals addComponent (...), enz. Maak.
toegevoegd de auteur 7zark7, de bron
Als u een BasePage heeft, gebruik dan een wicket: id voor de <body > -tag en verkrijg deze met behulp van getPage (). Find() (voor bijvoorbeeld) in de Panel 's onBeforeRender en er een AttributeModifier aan toe te voegen?
toegevoegd de auteur Xavi López, de bron

Ik denk dat je met BodyTagAttributeModifier op de goede weg zat, althans volgens JavaDoc. De compilatieproblemen in het gekoppelde artikel komen voort uit het gebruik van een niet-bestaande Constructor ...

in SpecialSidebarComponent zou je dit moeten kunnen doen:

add(new BodyTagAttributeModifier("class", Model.of("sidebar"), this));

Ik kan dit nu niet proberen, omdat ik niet op mijn ontwikkelcomputer zit ...

0
toegevoegd
Bedankt, mate - informatie toegevoegd over wat deze klasse feitelijk doet, is alleen van toepassing op de bovenliggende tag van Panel, niet op Page body
toegevoegd de auteur 7zark7, de bron
Alles dat naar een body-tag van een panel is geschreven, wordt gekopieerd naar de bodytag van de pagina's ...
toegevoegd de auteur Nicktar, de bron