2012-05-22 25 views
8

मैं gwt-platform का उपयोग कर रहा हूं और जीडब्ल्यूटी के संपादक ढांचे को लागू करने की कोशिश की। लेकिन मुझे इसे प्रस्तुतकर्ता के भीतर से काम नहीं मिल रहा है। वहाँ वेब के आसपास कुछ जवाब, का कहना है कि मैं प्रस्तुतकर्ता में किसी भी तरह EditorDriver इंजेक्षन करने के लिए है रहे हैं, लेकिन मैं ऐसा करने के तरीके नहीं पता ...जीडब्ल्यूटी-संपादक फ्रेमवर्क का उपयोग gwt-platform के साथ कैसे करें?

पल मैं सफलता के बिना इस कोशिश की पर:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers { 
    public interface MyView extends View, HasUiHandlers<MyUiHandlers>, Editor<MyModel> {} 

    @ProxyStandard 
    @NameToken(NameTokens.myPage) 
    @NoGatekeeper 
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    interface Driver extends SimpleBeanEditorDriver<MyModel, MyView> {} 
    private Driver editorDriver; 
    DispatchAsync dispatcher; 

    @Inject 
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) { 
     super(eventBus, view, proxy); 
     getView().setUiHandlers(this); 
     this.dispatcher = dispatcher; 

     MyModel m = new MyModel(); 
     m.setId(1L); 
     m.setUsername("username"); 
     m.setPassword("password"); 

     editorDriver = GWT.create(Driver.class); 
     editorDriver.initialize(this.getView()); 
     editorDriver.edit(m); 
    } 

    ... 
} 

यह काम करता है अगर मैं स्पष्ट रूप से ViewImplementation निर्दिष्ट करते हैं, लेकिन इस तरह से एमवीपी काम करना चाहिए नहीं है:

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {} 

... 

editorDriver.initialize((MyViewImpl) this.getView()); 

मैं अच्छा होगा अगर किसी ने मुझे कैसे इसे सही करने के लिए एक उदाहरण दे सकता है।

धन्यवाद

उत्तर

7

एक दृष्टिकोण क्या Expenses sample के पिछले संस्करण में इस्तेमाल किया गया था के लिए इसी तरह मेरे लिए काम किया:

एक इंटरफेस उस दृश्य को लागू करना चाहिए। वाइल्डकार्ड प्रयोग किया जाता है ताकि प्रस्तोता पता करने की जरूरत नहीं है ठोस दृश्य कार्यान्वयन:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers { 
    public interface MyView extends BeanEditView<MyModel>, HasUiHandlers<MyUiHandlers> {} 

    @ProxyStandard 
    @NameToken(NameTokens.myPage) 
    @NoGatekeeper 
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    private SimpleBeanEditorDriver<MyModel, ?> editorDriver; 
    DispatchAsync dispatcher; 

    @Inject 
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) { 
     super(eventBus, view, proxy); 
     getView().setUiHandlers(this); 
     this.dispatcher = dispatcher; 

     MyModel m = new MyModel(); 
     m.setId(1L); 
     m.setUsername("username"); 
     m.setPassword("password"); 

     editorDriver = getView().createEditorDriver(); 
    } 

    ... 
} 

और दृश्य implmementation:

public class MyViewImpl extends ViewWithUiHandlers<MyUiHandlers> implements 
    MyPresenter.MyView { 

    public interface Binder extends UiBinder<Widget, MyViewImpl> { } 
    private static Binder uiBinder = GWT.create(Binder.class); 

    /** 
    * The driver to link the proxy bean with the view. 
    */ 
    public interface EditorDriver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> { } 

    private final Widget widget; 

    public MyViewImpl() { 
    widget = uiBinder.createAndBindUi(this); 
    } 

    @Override 
    public SimpleBeanEditorDriver<MyModel, ?> createEditorDriver() { 
    EditorDriver driver = GWT.create(EditorDriver.class); 
    driver.initialize(this); 
    return driver; 
    } 

    @Override 
    public Widget asWidget() { 
    return widget; 
    } 

    ... 
} 

import com.google.gwt.editor.client.Editor; 
import com.gwtplatform.mvp.client.View; 

/** 
* Implemented by views that edit beans. 
* 
* @param <B> the type of the bean 
*/ 
public interface BeanEditView<B> extends View, Editor<B> { 

    /** 
    * @return a new {@link SimpleBeanEditorDriver} initialized to run 
    *   this editor 
    */ 
    SimpleBeanEditorDriver<B, ?> createEditorDriver(); 
} 

आपका प्रस्तोता कुछ इस तरह अब दिखना चाहिए

यह उतना करीब है जितना मैं जीडब्ल्यूटी के संपादक फ्रेमवर्क के साथ एमवीपी प्राप्त कर सकता हूं। मुझे मॉडल को नहीं जानने के लिए दृश्य कार्यान्वयन का कोई तरीका नहीं मिला लेकिन मुझे नहीं लगता कि यह वास्तव में आवश्यक है।

अगर किसी के पास इस पर कोई सुधार है, तो मुझे सुनकर खुशी हुई।


जीडब्ल्यूटी संपादकों पर कुछ अतिरिक्त टिप्पणियां मिलीं। ऐसा लगता है कि मॉडल को पूरी तरह से अलग करना संभव नहीं हो सकता है। थॉमस Broyer एक और संपादक सवाल का his answer में कहना है:

"एमवीपी पत्थर में सेट नहीं है (यह भी परिभाषित नहीं कर रहा है, यह मार्टिन Fowler द्वारा गढ़ा गया था, लेकिन वह दो और विशिष्ट पैटर्न के पक्ष में अवधि सेवानिवृत्त) , इसलिए आप केवल अपने द्वारा दिए गए नियमों का उल्लंघन कर रहे हैं। अलग-अलग, संपादक फ्रेमवर्क को पूरी तरह से एमवीपी का उल्लंघन करने के रूप में देखा जा सकता है: प्रत्येक संपादक मॉडल को जानता है, जरूरी नहीं कि यह सटीक उदाहरण है जो संपादन कर रहा है (जैसा कि ValueAwareEditor या LeafValue के साथ) , लेकिन कम से कम वस्तुओं की तरह यह एक संपादक है। "

+0

धन्यवाद :) शायद तुम सही हो और यह बुरा दृश्य मॉडल जानता है नहीं है, ' कारण मुझे ViewInterface में बहुत सारे सेटर्स और गेटर्स सेट करना होगा। इसका मतलब यह होगा कि दृश्य अपने मॉडल को भी जानता है, (प्रकार) ... –

+0

यह एक अच्छा समाधान है। धन्यवाद! – confile

+0

धन्यवाद। संपादकों और जीडब्ल्यूटीपी के साथ संघर्ष के 2 दिन बाद मैं इसे काम करता हूं। यदि आपने इस पर कुछ सुधार किए हैं तो कृपया मुझे बताएं। – masterdany88

0

एमवीपी का कहना है कि आप प्रस्तुतकर्ता का उपयोग मॉडल से पूरी तरह से अलग करने के लिए करते हैं। इसके अलावा मैं कहना चाहता हूँ कि अपने दृष्टिकोण को देखने के अंदर तर्क डालता है ... मुझे आशा है कि एक और समाधान उपलब्ध न हो;)

2

मुद्दा यह है कि Driver.class GWT.create

को
editorDriver = GWT.create(Driver.class); 

पारित कर दिया है कंक्रीट क्लास होना चाहिए जो सभी उप-संपादकों, यानी सभी यूबिंडेड विजेट्स रखे।

एक समाधान है निम्नलिखित:

दृश्य इंटरफ़ेस मॉडल वस्तु

public interface MyView extends View, ..., Editor<MyModel> 

दृश्य कार्यान्वयन MyViewImpl एक ड्राइवर प्रकार

interface MyDriverImpl extends SimpleBeanEditorDriver<MyModel,MyViewImpl> 

ड्राइवर है परिभाषित करता है के लिए संपादक इंटरफ़ेस फैली

द्वारा MyViewImpl में तत्काल 210

पेरेंट प्रकार

SimpleBeanEditorDriver<MyModel,MyView> 

प्रस्तोता के लिए ड्राइवर के संदर्भ पारित करने के लिए इस्तेमाल किया जा सकता