Using the DSL
Kotlin DSL tarjoaa rakentajatoimintoja webforJ-komponenteille. Kukin toiminto luo komponentin, lisää sen parentti-konttiinsa ja suorittaa konfigurointilohkon. Tämä sivu käsittelee malleja ja käytäntöjä, joita käytät rakentaessasi käyttöliittymiä DSL:llä.
Nimeämiskäytännöt
DSL-toimintoja on saatavilla kaikille vakiowebforJ-komponenteille, mukaan lukien painikkeet, kentät, layoutit, dialogit, vetovalikot, luettelot ja HTML-elementit. Kukin toiminto käyttää komponentin luokan nimeä camelCase-muodossa. Button muuttuu button():ksi, TextField muuttuu textField():ksi, ja FlexLayout muuttuu flexLayout():ksi.
div {
button("Klikkaa minua")
textField("Käyttäjätunnus")
flexLayout {
// sisäkkäinen sisältö
}
}
Break-komponenttiaYksi poikkeus: Break käyttää takaviivoja, koska break on Kotlin-avainsana:
div {
span("Rivi yksi")
`break`()
span("Rivi kaksi")
}
Komponenttien luominen
Luo komponentti lisäämällä sen DSL-toiminto parentti-blokkiin yhdessä valinnaisten argumenttien ja konfigurointilohkon kanssa, kuten alla on esitetty:
div {
// Luo Button, lisää se tähän div:iin ja suorittaa sitten lohkon
button("Lähetä") {
theme = ButtonTheme.PRIMARY
onClick { handleSubmit() }
}
}
Kun käytät komponentin DSL-toimintoa, se luo komponentin, lisää sen vanhempaan ja suorittaa myöhemmin konfigurointilohkon.
Konfigurointilohko saa komponentin vastaanottajaksi (this), joten voit käyttää ominaisuuksia ja metodeja suoraan:
textField("Sähköposti") {
placeholder = "sinä@esimerkki.com" // this.placeholder
required = true // this.required
onModify { validate() } // this.onModify(...)
}
Komponenttien sisällyttäminen
Komponentit, jotka voivat sisältää lapsia, hyväksyvät sisäkkäiset DSL-kutsut niiden lohkossaan:
flexLayout {
direction = FlexDirection.COLUMN
h1("Koontinäyttö")
div {
paragraph("Tervetuloa takaisin!")
button("Näytä raportit")
}
flexLayout {
direction = FlexDirection.ROW
button("Asetukset")
button("Kirjaudu ulos")
}
}
Laajuuden turvallisuus
DSL varmistaa asianmukaisen laajuuden. Voit lisätä lapsia vain komponentteihin, jotka tukevat niitä, ja kääntäjä estää vahingossa tapahtuvat viittaukset ulkoisiin laajuuksiin:
div {
button("Lähetä") {
// Tämä näyttää siltä, että se lisää kappaleen painikkeen sisään,
// mutta se lisää sen oikeasti ulompaan div:iin.
// DSL huomaa tämän virheen käännösvaiheessa.
paragraph("Lähetetään...") // Ei käänny
}
}
Jos sinun tarvitsee lisätä ulompaan laajuuteen, käytä nimettyä this:a, jotta tarkoitus tulee selväksi:
div {
button("Lähetä") {
this@div.add(Paragraph("Lähetetään...")) // Ilmaise tarkoitus
}
}
Tämä pitää käyttöliittymän koodin ennakoitavana ja tekee laajuuden hyppäykset näkyviksi.
Komponenttien tyylitys
Kotlin DSL tarjoaa styles-laajennusominaisuuden, joka antaa karttamaisen hakemisen CSS-ominaisuuksiin, vastaten Java:n setStyle() ja getStyle() -toimintoja:
button("Tyylitelty") {
styles["background-color"] = "#007bff"
styles["color"] = "valkoinen"
styles["padding"] = "12px 24px"
styles["border-radius"] = "4px"
}
Uudelleenkäytettäviä tyylejä varten, lisää CSS-luokkia inline-tyylien sijaan. HasClassName-laajennus mahdollistaa luokkien lisäämisen +=-merkillä:
button("Ensisijainen toiminto") {
classNames += "btn-primary"
}
Tapahtumien käsittely
Komponenttien on melkein aina reagoitava käyttäjän vuorovaikuttamiseen. DSL tarjoaa tiiviin tapahtumankuuntelijasyntaksin käyttämällä on-etuliitteellä varustettuja metodeja, jotka hyväksyvät lambdat:
button("Tallenna") {
onClick {
saveData()
showNotification("Tallennettu!")
}
}
textField("Haku") {
onModify { event ->
performSearch(event.text)
}
}
Yhteiset parametrit
Konfigurointilohkojen lisäksi useimmat DSL-toiminnot hyväksyvät myös yleisiä parametreja lohkon eteen usein käytettävien vaihtoehtojen vuoksi:
// Teksti parametri etiketeille/sisällölle
button("Klikkaa minua")
h1("Sivun otsikko")
paragraph("Kehysteksti")
// Etiketit ja paikkamerkit kentille
textField("Käyttäjätunnus", placeholder = "Syötä käyttäjätunnus")
passwordField("Salasana", placeholder = "Syötä salasana")
// Arvoparametrit syötteille
numberField("Määrä", value = 1.0) {
min = 0.0
max = 100.0
}
Nimetyt argumentit antavat sinun siirtää parametreja missä tahansa järjestyksessä, riippumatta siitä, kuinka ne esiintyvät funktion allekirjoituksessa.
Kokonaisen näkymän rakentaminen
Näitä malleja käyttäen tässä on täydellinen lomake, joka yhdistää ne:
@Route("contact")
class ContactView : Composite<Div>() {
private val self = boundComponent
init {
self.apply {
styles["max-width"] = "400px"
styles["padding"] = "20px"
h2("Ota yhteyttä")
val nameField = textField("Nimi", placeholder = "Nimesi") {
styles["width"] = "100%"
styles["margin-bottom"] = "16px"
}
val emailField = textField("Sähköposti", placeholder = "sinä@esimerkki.com") {
styles["width"] = "100%"
}
val messageField = textArea("Viesti", placeholder = "Miten voimme auttaa?") {
styles["width"] = "100%"
}
button("Lähetä viesti") {
theme = ButtonTheme.PRIMARY
styles["width"] = "100%"
onClick {
submitForm(
name = nameField.text,
email = emailField.text,
message = messageField.text
)
}
}
}
}
private fun submitForm(name: String, email: String, message: String) {
// Käsittele lomakkeen lähetys
}
}
DSL pitää käyttöliittymän rakenteen luettavana samalla, kun se antaa sinulle täydellisen pääsyn komponenttien konfigurointiin.