Molla ROO GWT con iniezione gin widget creati da ui: legante
-
08-10-2019 - |
Domanda
sto cercando di accedere ad alcuni oggetti all'interno di un'interfaccia utente: componente legante, ma non è sicuro di come accedere al EventBus, requestFactory, ecc senza scrivere codice brutta che mi terrà sveglio la notte (anche prendere atto che sono completamente nuovo per JAVA, lo sfondo è in Perl / Python / PHP).
Il mio file ui.xml:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<ui:style>
...
</ui:style>
<g:HorizontalPanel>
...
</g:HorizontalPanel>
</ui:UiBinder>
Iniettando l'EventBus in questo modo viene a mancare con com.ig.client.scaffold.ui.widget.R non ha alcun valore predefinito (pari a zero args) costruttore.
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
@Inject
public R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
}
Quindi, come per il messaggio di errore, ho creare un UIFactory e poi ottengo un errore ... '{} style.entityComponent'> manca attributo obbligatorio (s): EventBus Elemento ... (sembra che sta cercando di trovare l'EventBus nell'interfaccia utente:. Stylesheet legante
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
public @UiConstructor R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
@Inject
@UiFactory R makeR(){
return new R(eventBus);
}
}
Dalla lettura e la lettura e più leggere da un paio di giorni, non ho visto nessuno l'accesso alla EventBus, requestFactory e historyController direttamente nella vista legame alla ui: legante widget di che ha portato alla conclusione che probabilmente non è una best practice in ogni caso.
dire Let ho un ogetto, chiamiamolo Proxy, Proxy contiene HandleButtonClick che poi chiama eventBus.doSomething (). Come faccio a collegare questo oggetto proxy per l'interfaccia utente: legante widget di senza dover istanziare o senza dover passare intorno ad ogni widget di
?E 'possibile fare l'iniezione GIN su un'interfaccia e quindi implementare l'interfaccia tramite classe R che poi in qualche modo contenere gli oggetti che sto cercando?
Qualsiasi soluzione che il lavoro è il benvenuto, solo in cerca di un campione (che un n00b Java può capire) che fondamentalmente mi permetterà di collegare il mio front-end con il resto dei servizi creati da ROO.
Grazie J
Soluzione
Controlla la Model, View, Presenter modello - Risolve questo problema. Generalmente ogni logica non visualizzazione deve essere tenuto fuori le visualizzazioni di modo che 1 logico) la non visualizzazione può essere provato senza unità in esecuzione all'interno di una (lenta per istanziare) browser e 2) diverso display possono essere collegati alla stessa applicazione senza duplicare la logica senza display.
Ecco un esempio MVP esibendo il comportamento che stai cercando (nota che lo stile è un po ' diverso da quello delle Attività e luoghi di implementazione).
MyPresenter.java:
public class MyPresenter {
public interface Display extends IsWidget {
void setButtonClickHandler(ClickHandler buttonClickHandler);
}
private final Display display;
private final EventBus eventBus;
@Inject
public MyPresenter(EventBus eventBus,
Display display)
{
this.display = display;
this.eventBus = eventBus;
bind();
}
private void bind() {
display.setButtonClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new MyButtonClickedEvent());
}
});
}
public void go(HasWidgets container) {
container.add(display.asWidget());
}
}
MyView.ui.xml:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<g:Button ui:field="myButton"/>
</ui:UiBinder>
MyView.java
public class MyView extends Composite implements MyPresenter.Display {
interface MyViewUiBinder extends UiBinder<Widget, MyView> {}
private static MyViewUiBinder uiBinder = GWT.Create(MyViewUiBinder.class);
private ClickHandler buttonClickHandler = null;
public MyView() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("myButton")
void onButtonClick(ClickEvent event) {
if (buttonClickHandler != null) {
buttonClickHandler.onClick(event);
}
}
@Override
public void setButtonClickHandler(ClickHandler buttonClickHandler) {
this.buttonClickHandler = buttonClickHandler;
}
}
E nel modulo GIN: bind(MyPresenter.Display.class).to(MyView.class);