2016-07-21 22 views
0

Diese Frage ist über gute Wicket Design. Wir haben verschiedene Möglichkeiten, wie wir es umsetzen können, aber wir möchten einige Ideen bekommen, wie wir es besser gestalten können. Wir wollen einfach ein einfaches TimerPanel mit einem Label und einem Timer (eine Art StopWatch) bauen.Erstellen Sie benutzerdefinierte Komponente Modell (TimerPanel)

Wie sollten wir sein Modell entwerfen. Sicher brauchen wir die IModel<LocalDateTime> timerUntil. Aber wie können wir den Text des Labels im TimerPanel definieren?

Das TimerPanel wird in einem ParentPanel verwendet. Die ParentPanel hat ein Modell wie folgt aus:

public class ParentDto { 
    private LocalDateTime timerAValidUntil; 
    private LocalDateTime timerBValidUntil; 
} 

Da die ParentDto keine Informationen über das Label des TimerPanel haben, wird die folgende

new PropertyModel(getDefaultModel(), "timerAValidUntil") 

nicht genug.

Hier ist die die Frage: Sollten wir eine feste wicketId definieren, sagen wir timerLabel für das Label in der TimerPanel, und die Eltern-Panel hat es in seiner Panel.properties.xml zu definieren?. Wie (A Option)

timerPanelA:timerLabel 

oder ist besser, eine neue ModelObject, wie (Option B)

public class TimerDto() { 
    String timerLabel; 
    IModel<LocalDateTime> timerValidUntil; 
} 

Wir sind immer zu schaffen versuchen, unsere Modelle zu verbinden, so dass, wenn wir ändern Das ModelObject in einem Panel wird auch in allen abhängigen Panels geändert. Bitte teilen Sie Ihr Wissen ... Thx.

Antwort

1

Die Verwendung von Ressourcenschlüsseln in ParentPanel (Option A) ist vollkommen in Ordnung, dies ermöglicht Ihnen sogar, die Etiketten zu markieren.
Wenn Ihre Timer-Entity keine Beschriftung hat (z. B. vom Benutzer bearbeitet), sehe ich keinen zusätzlichen Gewinn.

Wicket kann mit fast allen Objekten in Modellen arbeiten, so dass keine Zwischenschicht aus DTOs erstellt werden muss. Sie werden sich viel schneller entwickeln, indem Sie Ihre Komponenten direkt an Ihre tatsächlichen Entitäten binden.

Ich könnte mich irren, aber das * Dto-Suffix von Ihrem Beispiel gibt mir den Eindruck, dass Sie die entgegengesetzte Richtung gehen.

1

Option A wäre besser, und Sie könnten ein StringResourceModel verwenden, um die Beschriftung und die Zeit in einem Steuerelement anzuzeigen.

PropertyModel timerModel = new PropertyModel(getDefaultModel(), "timerAValidUntil"); 
StringResourceModel labelModel = new StringResourceModel("timerLabel", this, timerModel)); 
Label timerLabel = new Label("timerLabel", labelModel); 

Wenn Sie möchten, dass es eine "Stoppuhr" Aktion hat, können Sie einen Link innerhalb des Etiketts hinzufügen. Siehe 'Wicket-Komponenten in die Nachricht einfügen' in Everything about Wicket internationalization