2015-10-05 55 views
3

我設置了我的第一個Vaadin應用與Vaadin 7.5.6官方Vaadin春天1.0.0。我想使用MVP模式,但我問自己如何組件一起工作。因爲我是MVP的新手,我不想使用任何插件,所以我試圖自己設置它。MVP結構

所以如果我是對的,LoginViewPresenter會給我presenterInstance.getView()的視圖。這已經運行良好,但我應該如何通過視圖訪問主持人?當我想爲我的觀點做一個邏輯操作時,我應該在演講者班上做。但是如何從視圖Buttonclicklistener中調用一個演示者方法?

我的第二個問題是,如果我有我的演示者類的UIScope註釋,什麼時候Spring從這個類實例化一個新的對象?只要UI存在,我就會努力。但是在構造函數中生成一個隨機字符串後,我打印出randomString變量的內容(在UI.class init()方法中),但總是有一個新值。

問候

LoginViewPresenter.java

@SpringComponent 
@UIScope 
public class LoginViewPresenter implements Serializable 
{ 
    private static final long serialVersionUID = 6286518141570430211L; 

    @Autowired 
    private LoginView view; 

    public final String randomString; 

    public LoginViewPresenter() 
    { 
     randomString = Utils.generateRandomString(8); 
    } 

    @PostConstruct 
    public void init() 
    { 

    } 

    public LoginView getView() 
    { 
     return view; 
    } 

    public void setView(LoginView view) 
    { 
     this.view = view; 
    } 
} 

LoginView.java

@SuppressWarnings("serial") 
@UIScope 
@SpringView(name = LoginView.NAME) 
public class LoginView extends VerticalLayout implements View 
{ 
    public static final String NAME = "LoginView"; 

    @PostConstruct 
    private void init() 
    { 
    } 

    @Override 
    public void enter(ViewChangeEvent event) 
    { 
    } 

} 

回答

2

你的看法should'nt知道主持人的。它應該引發事件,並且演講者可以聽取他們的意見。

這是我如何做到這一點:

LoginView.java

@SuppressWarnings("serial") 
@UIScope 
@SpringView(name = LoginView.NAME) 
public class LoginView extends VerticalLayout implements View { 
    public static final String NAME = "LoginView"; 

    @Autowired 
    private transient Collection<LoginViewListener> loginViewListeners; 

    @PostConstruct 
    private void init() { 
     ... 
     Button b = new Button("click me"); 
     b.addClickListener(e -> loginViewListeners.forEach(l -> l.eventFired())); 
     addComponent(b); 
     ... 
     loginViewListeners.forEach(listener -> listener.viewInitialized(this)); 
    } 

    @Override 
    public void enter(ViewChangeEvent event) 
    { 
    } 

    public interface LoginViewListener { 

     void viewInitialized(LoginView view); 


     void eventFired(); 

    } 

} 

LoginViewPresenter.java

@SpringComponent 
@UIScope 
public class LoginViewPresenter implements LoginViewListener, Serializable { 
    private static final long serialVersionUID = 6286518141570430211L; 

    private LoginView view; 

    public final String randomString; 

    public LoginViewPresenter() { 
     randomString = Utils.generateRandomString(8); 
    } 

    @PostConstruct 
    public void init() { 

    } 

    public LoginView getView() { 
     return view; 
    } 

    public void setView(LoginView view) { 
     this.view = view; 
    } 

    @Override 
    public void viewInitialized(LoginView v) { 
     setView(v); 
    } 

    @Override 
    void eventFired() { 
     ... 
    } 

} 

貴randomString還有總是與這種設計一個新的價值?

+0

謝謝您的回覆。你能告訴我在哪裏可以找到「ViewListener 」類嗎? – shinchillahh

+0

對不起,我忘了刪除它,你不需要它。它是一個與viewInitialized的接口,我使用它,所以我不必在每個偵聽器中添加viewInitialized ...我編輯了我的答案。 –

+0

..並且不要在您的演示者中注入視圖。當視圖對其偵聽器調用viewInitialized時,演示者將設置其視圖。 –