2012-02-20 9 views
0

ネスティングされたエディタの実例を教えてください。私はthisの文書を読みましたが、それは私を助けませんでした。私のコードで私はクラスを持っています組織GWT2でどのようにネストされたエディタを実行しますか?

Organizationは、タイプPersonのフィールドcontactPersonを有する。

だから私は人のために、次のエディタを作成しました:

public class PersonEditor extends Composite implements Editor<PersonProxy> 
{ 
    interface PersonEditorUiBinder extends UiBinder<Widget, PersonEditor> 
    { 
    } 

    private static PersonEditorUiBinder uiBinder = GWT.create(PersonEditorUiBinder.class); 

    @UiField 
    ValueBoxEditorDecorator<String> name; 
    @UiField 
    ValueBoxEditorDecorator<String> phoneNumber; 
    @UiField 
    ValueBoxEditorDecorator<String> email; 

    @UiField 
    CaptionPanel captionPanel; 

    public void setCaptionText(String captionText) 
    { 
     captionPanel.setCaptionText(captionText); 
    } 

    public PersonEditor() 
    { 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

それに対応する.ui.xmlは、それがうまく動作

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
      xmlns:g='urn:import:com.google.gwt.user.client.ui' 
      xmlns:e='urn:import:com.google.gwt.editor.ui.client' 

      ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' 
      ui:generateKeys="com.google.gwt.i18n.server.keygen.MD5KeyGenerator" 
      ui:generateLocales="en,ru"> 
    <ui:style src="../common.css"/> 
    <g:CaptionPanel captionText="Test" ui:field="captionPanel"> 
     <g:HTMLPanel> 
      <table class="{style.forform}"> 
       <tr> 
        <th class="{style.forform}"> 
         <div> 
          <ui:msg meaning="person's name">Name:</ui:msg> 
         </div> 
        </th> 
        <td class="{style.forform}"> 
         <e:ValueBoxEditorDecorator ui:field="name" stylePrimaryName="{style.forform}"> 
          <e:valuebox> 
           <g:TextBox stylePrimaryName="{style.forform}"/> 
          </e:valuebox> 
         </e:ValueBoxEditorDecorator> 
        </td> 
       </tr> 
       <tr> 
        <th class="{style.forform}"> 
         <div> 
          <ui:msg>Phone Number:</ui:msg> 
         </div> 
        </th> 
        <td class="{style.forform}"> 
         <e:ValueBoxEditorDecorator ui:field="phoneNumber" stylePrimaryName="{style.forform}"> 
          <e:valuebox> 
           <g:TextBox width="100%" stylePrimaryName="{style.forform}"/> 
          </e:valuebox> 
         </e:ValueBoxEditorDecorator> 
        </td> 
       </tr> 
       <tr> 
        <th class="{style.forform}"> 
         <div> 
          <ui:msg>EMail:</ui:msg> 
         </div> 
        </th> 
        <td class="{style.forform}"> 
         <e:ValueBoxEditorDecorator ui:field="email" stylePrimaryName="{style.forform}"> 
          <e:valuebox> 
           <g:TextBox width="100%" stylePrimaryName="{style.forform}"/> 
          </e:valuebox> 
         </e:ValueBoxEditorDecorator> 
        </td> 
       </tr> 
      </table> 
     </g:HTMLPanel> 
    </g:CaptionPanel> 
</ui:UiBinder> 

です。ここで

は、組織のためのエディタです:

public class OrganizationEditor extends Composite implements Editor<OrganizationProxy> 
{ 
    interface OrganizationEditorUiBinder extends UiBinder<Widget, OrganizationEditor> 
    { 
    } 

    private static OrganizationEditorUiBinder uiBinder = GWT.create(OrganizationEditorUiBinder.class); 

    @UiField 
    CaptionPanel captionPanel; 

    @UiField 
    ValueBoxEditorDecorator<String> name; 

    @UiField 
    ValueBoxEditorDecorator<String> address; 

    @UiField 
    PersonEditor personEditor; 

    public void setCaptionText(String captionText) 
    { 
     captionPanel.setCaptionText(captionText); 
    } 

    public OrganizationEditor() 
    { 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

とそれに対応する.ui.xmlは、組織のプロキシの

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
      xmlns:g='urn:import:com.google.gwt.user.client.ui' 
      xmlns:e='urn:import:com.google.gwt.editor.ui.client' 
      xmlns:c='urn:import:com.zasutki.courierApp.client.customer' 
      xmlns:myui='urn:import:com.zasutki.courierApp.client.ui' 

      ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' 
      ui:generateKeys="com.google.gwt.i18n.server.keygen.MD5KeyGenerator" 
      ui:generateLocales="en,ru"> 
    <ui:style src="../common.css"/> 
    <g:CaptionPanel ui:field="captionPanel"> 
     <myui:VerticalFlowPanel> 
      <g:HTMLPanel> 
       <table class="{style.forform}"> 
        <tr> 
         <th class="{style.forform}"> 
          <div> 
           <ui:msg meaning="Name of organization">Name:</ui:msg> 
          </div> 
         </th> 
         <td class="{style.forform}"> 
          <e:ValueBoxEditorDecorator ui:field="name" stylePrimaryName="{style.forform}"> 
           <e:valuebox> 
            <g:TextBox stylePrimaryName="{style.forform}"/> 
           </e:valuebox> 
          </e:ValueBoxEditorDecorator> 
         </td> 
        </tr> 
        <tr> 
         <th class="{style.forform}"> 
          <div> 
           <ui:msg>Address:</ui:msg> 
          </div> 
         </th> 
         <td class="{style.forform}"> 
          <e:ValueBoxEditorDecorator ui:field="address" stylePrimaryName="{style.forform}"> 
           <e:valuebox> 
            <g:TextBox stylePrimaryName="{style.forform}"/> 
           </e:valuebox> 
          </e:ValueBoxEditorDecorator> 
         </td> 
        </tr> 
       </table> 
       <c:PersonEditor ui:field="personEditor" captionText="Contact person"> 
        <ui:attribute name="captionText"/> 
       </c:PersonEditor> 
      </g:HTMLPanel> 
     </myui:VerticalFlowPanel> 
    </g:CaptionPanel> 
</ui:UiBinder> 

インタフェースである

@ProxyFor(value = Organization.class, locator = ObjectifyLocator.class) 
public interface OrganizationProxy extends EntityProxy 
{ 
    public String getName(); 
    public void setName(String name); 
    public String getAddress(); 
    public void setAddress(String address); 
    public PersonProxy getContactPerson(); 
    public void setContactPerson(PersonProxy contactPerson); 
} 

で、最終的にここにクラスであります上記のすべてを使用するもの

public class NewOrderView extends Composite 
{ 
    interface Binder extends UiBinder<Widget, NewOrderView> 
    { 
    } 

    private static Binder uiBinder = GWT.create(Binder.class); 

    // Empty interface declaration, similar to UiBinder 
    interface OrganizationDriver extends SimpleBeanEditorDriver<OrganizationProxy, OrganizationEditor> 
    { 
    } 

    OrganizationDriver driver = GWT.create(OrganizationDriver.class); 

    @UiField 
    Button save; 

    @UiField 
    OrganizationEditor orgEditor; 

    OrganizationProxy organizationProxy; 

    public NewOrderView() 
    { 
     initWidget(uiBinder.createAndBindUi(this)); 

     organizationProxy = createFactory().contextOrder().create(OrganizationProxy.class); 

     // Initialize the driver with the top-level editor 
     driver.initialize(orgEditor); 

     // Copy the data in the object into the UI 
     driver.edit(organizationProxy); 
    } 

    @UiHandler("save") 
    void buttonClick(ClickEvent e) 
    { 
     e.stopPropagation(); 

     OrganizationProxy edited = driver.flush(); 
     PersonProxy person = edited.getContactPerson(); 
     // person is always null !!! 
     if (driver.hasErrors()) 
     { 
     } 
    } 
} 

ネストされたエディタ(PersonEditor)が自動的にフラッシュされないのはなぜですか?それは起こるはずですか?適切な解決策は何ですか?

答えて

0

@UiField 
    ValueBoxEditorDecorator<PersonEditor> contactPerson; 

を変更ああ...私は手動でcontactPersonのプロキシを作成する必要があります!

public class NewOrderView extends Composite 
{ 
    public NewOrderView() 
    { 
     initWidget(uiBinder.createAndBindUi(this)); 

     AdminRequestFactory.OrderRequestContext orderRequestContext = createFactory().contextOrder(); 
     organizationProxy = orderRequestContext.create(OrganizationProxy.class); 
     organizationProxy.setContactPerson(orderRequestContext.create(PersonProxy.class)); 

     // Initialize the driver with the top-level editor 
     driver.initialize(orgEditor); 

     // Copy the data in the object into the UI 
     driver.edit(organizationProxy); 
    } 
} 
1
<e:ValueBoxEditorDecorator ui:field="contactPerson"> 
        <e:valuebox> 
         <c:PersonEditor captionText="Contact person"> 
          <ui:attribute name="captionText"/> 
         </c:PersonEditor> 
        </e:valuebox> 
       </e:ValueBoxEditorDecorator> 

このコードは例外をスローします。 <e:valuebox>の後に、ValueBoxのサブタイプ(TextBox、DoubleBoxなど)が必要です。あなたのPersonEditorはValueBoxではありません。だから、通常のウィジェットのようにOrganizationEditorのui.xmlにPersonEditorを追加するだけです。例えば

:Javaクラスで

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    ....> 
    <ui:style src="../common.css"/> 
    <g:CaptionPanel ui:field="captionPanel"> 
     <myui:VerticalFlowPanel> 
      <g:HTMLPanel> 
       <table class="{style.forform}"> 
      // your other input fields 
       </table> 
      </g:HTMLPanel> 

      // Add the PersonEditor to the FlowPanel 
      <c:PersonEditor captionText="Contact person"> 
       <ui:attribute name="captionText"/> 
      </c:PersonEditor> 
      </myui:VerticalFlowPanel> 
     </g:CaptionPanel> 
    </ui:UiBinder> 

は、

@UiField 
    PersonEditor contactPerson; 
+0

私はそれを試みた。 'OrganizationEditor'から' OrganizationProxy'を取得したとき、その 'contactPerson'はnullです。したがって、入れ子にされた 'PersonEditor'からのデータは最終的な' OrganizationProxy'にコピーされませんでした。なぜどんなアイデア? – expert

+0

'OrganizationEditor'を単独で使うときにはうまくいきます。ネストされていると自動的にフラッシュされません。 – steffinchen

+0

それは決して動作しません:)それは自動的にフラッシュされるはずですか?どこに(コード内)で、どのように私はそれをフラッシュする必要がありますか? – expert

関連する問題