Wicket - tana yorlig'i xususiyati qo'shing

Men qoldim -

Menga Wicket Panelning sinfga attributini qo'shishga qodir bo'lishim kerak<body> tag of whatever page it's on. Example usage:

Java:

add(new SpecialSidebarComponent("sidebar"));

Yaratilgan HTML:

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

Viktorina qo'sha olmayman va tanani Wicket komponentiga aylantira olmayman, chunki bu men uchun katta sahifa hiyerarşisindeki bir sahifaga komponentlar qo'shish juda qiyin bo'lib qoladi va bu hali Panelni o'zgartirishga ruxsat bermaydi. tananing atributi.

Menimcha BodyTagAttributeModifier bo'lishi mumkin, lekin, ehtimol, bu boshqa narsa uchun va uni ishlashga qodir emas ( Wicket: BodyTagAttributeModifier sinfidan qanday foydalanish kerak? )

Har qanday foydali fikrlar bormi?

Yangilash:

Bunga qarab, BodyTagAttributeModifier sinfining faqat faqat , Panelning yuqori yorlig'i uchun emas, balki Sahifa<body> tag:

Misol (Scala sintaksisi):

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

Andoza:

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

Ko'rsatilgan:

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

Hello World!

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

IMHO nomini juda chalkashtirib yuboradi. Muammoni hal qilmaydi, lekin hech bo'lmaganda mantiqan to'g'ri keladi.

1

3 javoblar

Men shaxsan, bu Javascript variantini ushbu maxsus ish uchun eng pok deb o'ylayman. Biroq, qo'shish (Komponent ...) haqida yakuniy sharhingiz menga setTransparentResolver (true) usuliga qiziqish mumkinligiga ishonishimga olib keladi. Mana qanday ishlaydi ...

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 (BasePage-ni kengaytiradi)

public class MyPage extends BasePage {

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

SidebarPanelni BasePage-dagi bodyContainer-ga to'g'ridan-to'g'ri qo'shmasangiz ham, u setTransparentResolver (true) tufayli ishlaydi.

Sizning oddiy ishingiz uchun Javascript bilan yuring. Subklasslar konteynerlarga joylasholmaydigan tuyg'ularning umumiy muammosi uchun ochiq-oydin echim to'g'risida xabardor bo'ling.

3
qo'shib qo'ydi
Albatta, bu siz dan foydalanmayapsiz
qo'shib qo'ydi muallif jbrookover, manba
Har bir sahifani kiritish BasePage ni kengaytirib, ((BasePage) getPage ()) funktsiyasini bajarishingiz mumkin: bodyClass = ... . Men, albatta, asosiy sahifada maxsus usullar bilan buni juda ko'p qildim.
qo'shib qo'ydi muallif jbrookover, manba
Afsuski, body konteynerining tarkibiy qismlarni sahifaga qo'shishni qiyinlashtirayotgani - ehtimol sizning kodingizga bodyContainer.add (...) ni kiritish kerakligini ko'rsatdi. transparentResolver bilan siz buni qilishingizga hojat yo'q. Afishada, shuningdek, BasePage turi senariysi ishlatilayotganligini ham ko'rsatdi. Men buni juda ko'p narsa {wp_img} Border bo'lgan Dialog turi komponenti bilan qildim, lekin ba'zi tarkibiy qismlarga tarkibiy qismlarni qo'shishni hohlamayman ota-ona sinf.
qo'shib qo'ydi muallif jbrookover, manba
Bu kamdan-kam foydali, lekin siz uni to'g'ri ishlatishingiz mumkin bo'lgan paytda juda yaxshi. Turli komponentlar bilan bir qatorda, bir xil ramka bilan o'nlab murakkab dialoglarni yaratishda uni sevib qoldim. FrameDialog shaffof bir çözümleyici bo'lgan ildiz konteynerga ega bo'lib, keyin AddTextDialog FrameDialog kengaytirildi.
qo'shib qo'ydi muallif jbrookover, manba
Yaxshi namuna, lekin OV da Page ning <body> kodini Panel dan qo'shilganligini emas, balki < kodi> Sahifa pastki klassini tanlang.
qo'shib qo'ydi muallif Xavi López, manba
Ha, haqiqatan ham, bu mening yo'l-yo'riqlarim. Shunga qaramasdan, transparentResolver va pastki sinfi bu misolda o'z hissasini qo'shmoqda.
qo'shib qo'ydi muallif Xavi López, manba
Oh, buyuk, hozir men uni ko'rib turibman, sharhlaringiz uchun minnatdorman :) +1, oshkora hal qiluvchi - yaxshi tanlov. Bu holatda faqatgina <body> tagini va ni ushlab turadigan BasePage-ning superklassi bo'lar edim.
qo'shib qo'ydi muallif Xavi López, manba
Cool :-) Wicket juda kuchli!
qo'shib qo'ydi muallif Xavi López, manba

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.

Shu bilan birga JavaScript orqali ham foydalanishingiz mumkin. IHeaderContributor ilovasini Panel amalga oshiring va 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
qo'shib qo'ydi
Fikr uchun tashakkur, Javascript yondashuvini hisobga olmagan - qiziqarli ko'rinadi. Boshqa nuqtada - men asosiy sinfga ega bo'lsam-da, (Komponent ...) qo'shilsa, addComponent (...) kabi maxsus usullarni yaratmagunimcha, subclasslardan komponentlarni qo'shish uchun og'riq bor.
qo'shib qo'ydi muallif 7zark7, manba
Agar sizda BasePage bo'lsa, nima uchun <body > tagiga kirish uchun idish ishlatmang va uni getPage() yordamida toping.() misol uchun Panel ning onBeforeRender va unga AttributeModifier qo'shing?
qo'shib qo'ydi muallif Xavi López, manba

Menimcha, hech bo'lmaganda JavaDoc bo'yicha BodyTagAttributeModifier bilan to'g'ri yo'ldan o'tgan edingiz. Bog'langan maqoladagi kompilyatsiya muammolari mavjud bo'lmagan Konstruktordan foydalanishdan kelib chiqadi ...

SpecialSidebarComponent-da buni amalga oshirishingiz kerak:

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

Hozirgi paytda bu ishni qila olmayman, chunki men kompyuterni ishlab chiqarmaganman ...

0
qo'shib qo'ydi
Bu sinfning aslida nima qilayotgani haqida minnatdorman, faqatgina Panelning yuqori yorlig'i uchun emas, balki sahifa korpusi
qo'shib qo'ydi muallif 7zark7, manba
Paneli tanasi yorlig'iga yozilgan biror narsa bodytag sahifalariga ko'chiriladi ...
qo'shib qo'ydi muallif Nicktar, manba