Automatic Binding
webforJ bietet mehrere Funktionen, die den Konfigurations- und automatischen Bindungsprozess für Entwickler optimieren. In diesem Abschnitt wird gezeigt, wie diese Funktionen effektiv genutzt werden können.
Verwendung von BindingContext.of
Die Methode BindingContext.of
bindet automatisch UI-Komponenten an die Eigenschaften einer bestimmten Bean-Klasse, was den Bindungsprozess vereinfacht und die manuelle Einrichtung reduziert. Sie gleicht bindbare Komponenten, die als Felder innerhalb eines Formulars oder einer App deklariert sind, mit Bean-Eigenschaften anhand ihrer Namen ab.
public class HeroRegistration extends App {
// Bindbare Komponenten
TextField name = new TextField("Textfeld");
ComboBox power = new ComboBox("Kraft");
// ...
@Override
public void run() throws WebforjException {
BindingContext<Hero> context = BindingContext.of(this, Hero.class, true);
// ...
}
}
public class Hero {
private String name;
private String power;
// Setters und Getters
}
UseProperty
Annotation
Verwenden Sie die Annotation UseProperty
, um den Namen der Bean-Eigenschaft anzugeben, wenn der Name des UI-Feldes nicht mit dem Namen der Bean-Eigenschaft übereinstimmt.
public class HeroRegistration extends App {
// Bindbare Komponenten
@UseProperty("name")
TextField nameField = new TextField("Textfeld");
ComboBox power = new ComboBox("Kraft");
// ...
}
Im obigen Beispiel lautet der Name des UI-Feldes nameField
, aber die Bean-Eigenschaft ist name
. Sie können das UI-Feld mit dem Namen der Bean-Eigenschaft annotieren, um eine ordnungsgemäße Bindung sicherzustellen.
BindingExclude
Annotation
Verwenden Sie die Annotation BindingExclude
, um eine Komponente von automatischen Bindungskonfigurationen auszuschließen, wenn Sie sie manuell binden oder ganz ausschließen möchten.
public class HeroRegistration extends App {
// Bindbare Komponenten
@UseProperty("name")
TextField nameField = new TextField("Textfeld");
@BindingExclude
ComboBox power = new ComboBox("Kraft");
// ...
}
UseValidator
Annotation
Verwenden Sie die Annotation UseValidator
, um Validatoren zu deklarieren, die zusätzliche Validierungsregeln während der Bindung durchsetzen. Validatoren werden in der Reihenfolge angewendet, in der Sie sie angeben.
public class UserRegistration extends App {
@UseValidator(EmailValidator.class)
TextField email = new TextField("E-Mail-Adresse");
}
UseTransformer
Annotation
Verwenden Sie die Annotation UseTransformer
, um eine Transformerkasse direkt auf einem UI-Feld zu deklarieren. Der BindingContext
wendet automatisch den angegebenen Transformator an.
public class UserRegistration extends App {
@UseProperty("date")
@UseTransformer(DateTransformer.class)
DateField dateField = new DateField("Datumfeld");
}
BindingReadOnly
Annotation
Verwenden Sie die BindingReadOnly
, um eine Bindung als schreibgeschützt zu kennzeichnen.
public class UserRegistration extends App {
@BindingReadOnly
TextField IDField = new TextField("Benutzer-ID");
}
BindingRequired
Annotation
Verwenden Sie BindingRequired
, um eine Bindung als erforderlich zu kennzeichnen. Siehe auch erforderliche Bindungserkennungen.
public class UserRegistration extends App {
@BindingRequired
TextField emailField = new TextField("Benutzer-E-Mail");
}
Daten automatisch schreiben
Um die Reaktionsfähigkeit und Dynamik von Anwendungen zu verbessern, können Sie die Methode observe
verwenden. Diese Methode stellt sicher, dass Änderungen an UI-Komponenten sofort an das Datenmodell weitergegeben werden. Sie ist besonders nützlich, wenn Sie eine kontinuierliche Synchronisierung zwischen dem Datenmodell und der UI benötigen.
Die Methode observe
registriert einen ValueChangeEvent
-Listener für alle Bindungen im Kontext, um Änderungen, die vom Benutzer vorgenommen werden, zu überwachen und schreibt diese Änderungen sofort in die gebundenen Eigenschaften des Modells, sofern sie gültig sind. Wenn Sie diese Methode zum ersten Mal aufrufen, spiegelt sie die Bean-Eigenschaften in den UI-Komponenten wider.
Hier ist ein Beispiel, wie Sie observe
verwenden können:
Hero bean = new Hero("Superman", "Fliegen");
BindingContext<Hero> context = BindingContext.of(this, Hero.class, true);
context.observe(bean);
context.onValidate(e -> {
submit.setEnabled(e.isValid());
});
submit.onClick(e -> {
ValidationResult results = context.validate();
if (results.isValid()) {
// Maßnahmen mit der Bean ergreifen.
}
});
Diese automatische Bindung ist unidirektional; Änderungen im Modell werden nur dann in den UI-Komponenten reflektiert, wenn Sie die Methode zum ersten Mal aufrufen.
Während observe
die Interaktivität von Anwendungen erhöht, ist es wichtig, sie mit Bedacht zu verwenden:
- Leistungswirkung: Häufige Updates können die Leistung beeinträchtigen, insbesondere bei komplexen Modellen oder langsamen Backend-Diensten.
- Benutzererlebnis: Automatische Updates sollten die Fähigkeit des Benutzers, Daten bequem einzugeben, nicht stören.
Erforderliche Bindungserkennungen
Wenn Sie eine Bindung als erforderlich kennzeichnen, kennzeichnet sie die Komponente als erforderlich, vorausgesetzt, die Komponente unterstützt diesen Zustand über die RequiredAware
-Schnittstelle. Die Bindung setzt diesen Zustand nicht selbst durch, sondern legt ihn bei entsprechender Anwendung auf der Komponente fest.
BindingContext<User> context = new BindingContext<>(User.class, true);
context
.bind(emailField, "email")
.required()
.add()
Beim Verwenden von Jakarta-Annotationen kann die Bindung automatisch den erforderlichen Zustand erkennen, basierend auf dem Vorhandensein einer der folgenden Annotationen auf Bean-Eigenschaften:
@NotNull
@NotEmpty
@NotBlank
@Size