Wir haben eine Webanwendung, die für jeden wichtigen Kunden ein anderes Thema benötigt. Der ursprüngliche Entwickler hat dies getan, indem er die URL in Javascript betrachtet und ein Stylesheet hinzugefügt hat, um das Standardthema zu überschreiben.
Ein Problem dabei ist, dass die Site einige Sekunden lang standardmäßig aussieht und dann plötzlich zum richtigen Thema wechselt. Ein anderes ist, dass es eine Menge Bandbreite / Zeit zu verschwenden scheint.
Meine derzeitige Idee besteht darin, einen "standardmäßigen" ClientBundle mit unserem Standard-Look & Feel erweitern diese Schnittstelle und überschreiben jeden Eintrag (wie benötigt) mit den Bildern des Clients unter Verwendung der verschiedenen Anmerkungen wie @ImageResouce und zeigen auf einen anderen Ort.
Hat jemand Erfahrung damit gemacht? Ein Problem, das ich vorhersehe, ist nicht in der Lage, die uibinder style Tags zu verwenden, da sie statisch auf ein bestimmtes Ressourcenbündel zeigen.
Irgendwelche Ideen?
Überschüssige Bundles
Ja, das kannst du.
Ich habe das Override-Ding mit ClientBundles gemacht und funktioniert gut. Eine Sache, die Sie tun müssen, ist, die Arten der Eigenschaften auch zu erben. Mit einem Beispiel:
%Vor%Und dann müssen Sie diesen Weg erben:
%Vor% und OtherNestedBundle extends NestedBundle
und OtherStyles extends Styles
Zumindest bei CSS: Wenn die Eigenschaften NICHT unter Verwendung der Child-Schnittstelle deklariert werden, erzeugen sie Styles für den gleichen CSS-Klassennamen und alle werden gemischt. Deklarieren Sie daher Stile mit den untergeordneten Schnittstellen:)
Flexible UIBinder
Sie können festlegen, dass außerhalb des zu verwendenden Bundles verwendet wird, wenn Sie UiField(provided=true)
annotation verwenden. Auf diese Weise setzen Sie zunächst das Bündel und rufen dann den uibindler auf. Es wird das Ressourcenfeld verwenden, vorausgesetzt, es wurde bereits erstellt.
Verzögerte Bindung
Sie könnten GWT.runAsync verwenden, um nur das richtige Paket zu laden.
Ein Beispiel
Die Datei ui.xml
%Vor%die entsprechende Klasse
%Vor%Einige Bundle-Schnittstellen
%Vor%Wenn Sie etwas nicht überschreiben, ist es in Ordnung
Optionen für die Bundle Factory
1) nur insgesamt
%Vor%2) runAsync (einfach den benötigten Teil laden ... aber nachdem der erste Teil ausgeführt wurde)
%Vor% 3) Verwenden Sie Deferred-Binding und Generatoren zum automatischen Generieren von Factory in der Kompilierungszeit basierend auf annotierten Bündeln wie @ThemeBundle("one")
Dieses Beispiel stammt aus der realen Welt. Ich verwende eine DynamicEntryPointWidgetFactory (kurz DEPWidgetFactory), um ein Widget basierend auf einer Bezeichner-Zeichenfolge zu erstellen. Jedes Widget ist ein Anwendungsbildschirm und jedes Hauptmenü hat den Widgetnamen, den es erstellen muss.
In Ihrem Fall wird die ID das zu erstellende Thema sein.
Wichtig: Wenn Sie runAsync verwenden, können Sie das Ressourcenbundle nicht direkt vor dem Erstellen der Benutzeroberfläche erstellen, wie zuvor im Beispielcode. Sie müssen nach dem Thema fragen, und wenn es fertig ist (im Callback), übergeben Sie es an Ihren Widget-Konstruktor und Ihr Widget kann es seinem Feld zuweisen.
Die Fabrikschnittstelle:
%Vor%Die Annotation für zu generierende Widgets:
%Vor%Die Modulkonfiguration:
Es heißt: Die Implementierung für die Factory wird mit dieser Klasse generiert (die andere Option ist replace-with, aber in unserem Fall haben wir keine vordefinierten Optionen für jedes Gebietsschema oder Browser, aber etwas dynamischer) .
%Vor%Der Generator:
%Vor%Tags und Links gwt uibinder clientbundle