2011-01-09 9 views
1

ui : binder 구성 요소 내부의 일부 객체에 액세스하려고 시도하지만 불쾌한 코드를 작성하지 않고 eventBus, requestFactory 등에 액세스하는 방법을 알지 못합니다. 밤에 나를 깨워 둡니다. (자바가 완전히 새롭고, 배경은 Perl/Python/PHP입니다.)ui : binder로 만든 위젯에 GIN을 삽입 한 Spring ROO GWT

내 ui.xml 파일 :이 방법은 com.ig.client.scaffold.ui.widget.R에 실패 eventBus를 주입

<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> 

는 디폴트 (제로 인수) 생성자가 없습니다.

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)); 
    } 
} 

그래서, 오류 메시지에 따라, 나는 나타내는 UIFactory를 만든 다음 나는 오류 를 얻을 ... '{style.entityComponent}'> 필수 속성 (들)이 누락 : eventBus 요소 (는 UI의 eventBus 찾기 위해 노력하고있는 것처럼 보인다. 바인더 스타일 시트를

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); 
    } 
} 

읽기와 읽기와 일 지난 몇 더 읽기에서, 나는 eventBus, requestFactory 및 historyController 액세스하는 사람을 보지 못했다 ui : 바인더 위젯에 바인딩 된 뷰에서 직접적으로 이것이 베스트 프랙티스가 아님을 결론 내 렸습니다. a 너.

내가 객체를 가지고 있다고 가정 해 봅시다. 프록시라고 부르죠. 프록시에는 handleButtonClick이 포함되어 있으며이 객체는 eventBus.doSomething()을 호출합니다. 이 프록시 객체를 인스턴스화하지 않거나 모든 위젯에 전달하지 않고 ui : 바인더 위젯에 어떻게 연결합니까?

인터페이스에서 GIN 삽입을 수행 한 다음 클래스 R을 통해 해당 인터페이스를 구현할 수 있습니까? 그러면 내가 찾고있는 객체가 어떻게 든 포함될 것입니까?

기본적으로 ROO가 만든 서비스의 나머지 부분과 프론트 엔드를 연결할 수있는 샘플 (Java n00b가 이해할 수 있음)을 찾는 데 도움이되는 모든 솔루션이 환영입니다.

감사 J Model, View, Presenter pattern 밖으로

답변

2

확인 -이 이 문제를 해결합니다. 일반적으로 모든 비 표시 논리는 사용자의보기 중 으로 유지되어야합니다. 1) 표시기가 느린 브라우저에서 실행되는 없이 표시되지 않는 논리를 장치 단위로 테스트 할 수 있고 2) 서로 다른 표시를 동일한 것으로 연결할 수 있습니다 응용 프로그램을 복제하지 않고 비 표시 논리.

여기 당신이 찾고있는 행동을 발휘하지 MVP의 예입니다 (스타일이 약간 활동 & 환경 구현과는 다른 이다).

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.

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; 
    } 
} 

그리고 당신의 GIN 모듈에서 자바

: bind(MyPresenter.Display.class).to(MyView.class);

+0

감사 제이슨, 오늘 아침 구글 코드의 MVP 워드 프로세서를 통해 읽기되고 나중에 오늘 밤을 구현하는 것, 내가 찾던 정확히 것 같았다. 감사합니다 백만 :-) –

+0

안녕하세요 제이슨, 나는 당신의 예제를 작동시키지 않고 있습니다. 소스를 사용할 수 있습니까? 아니면 내 코드를보고 문제를 지적 해 주시겠습니까? 일을하고 지금 몇 주 동안 고투하고있다. –

+0

내가 겪어야 할 문제에 대한 새로운 질문을하고 여기에있는 의견의 링크를 클릭하면보실 수 있습니다. –

관련 문제