AutoBound Synchronization
mprk May 24, 2014 2:40 PMI have a basic login form that I'm trying to sync with a model using the AutoBound feature. I can place data in the form, but it doesn't make it to the controls for authentication.
I'm assuming that Bound fields in the web component class link directly with ui:field annotated properties in the UI Binder web interface. I tried a few different properties on the web page side, and nothing seemed to fall into place.
I thought I looked at the documentation samples fairly carefully, but I'm not sure what to try next.
Class to pass credentials to a web service endpoint.
@Bindable
@Portable
public class Credentials {
  String username = "";
  String password = "";
  public Credentials(){
  }
  public Credentials(@MapsTo("username") String username,
            @MapsTo("password") String password ){
  this.username = username;
  this.password = password;
  }
  public void setUsername( String username ){
  this.username = username;
  }
  public String getUsername(){
  return username;
  }
  public void setPassword( String password ){
  this.password = password;
  }
  public String getPassword(){
  return password;
  }
}
The Login Component with AutoBound model class and Bound field properties that match ui:fields in the HTML page.
@Dependent
public class LoginPanel extends Composite {
  private static LoginPanelUiBinder uiBinder = GWT.create(LoginPanelUiBinder.class);
  interface LoginPanelUiBinder extends UiBinder<Widget, LoginPanel> {}
  @Inject
  TransitionTo<MapPage> loginApproved;
  @Inject @AutoBound
  DataBinder<Credentials> credentials;
  @Inject @Bound
  TextBox username;
  @Inject @Bound
  PasswordTextBox password;
  @Inject
  Button login;
  @Inject
  Label errorMessage;
  @Inject
  Caller<UserEndpoint> userService;
  /**
  *
  */
  public LoginPanel() {
       super();
       initWidget(uiBinder.createAndBindUi(this));
  }
  @UiHandler("login")
  public void onClick(ClickEvent event) {
       userService.call( new RemoteCallback<Boolean>() {
            @Override
            public void callback(Boolean authenticated) {
                 if ( authenticated.booleanValue() ){
                      loginApproved.go();
                 }
            }
       }).authenticate( credentials.getModel() );
  }
}
The finally the Login HTML form for the UI Binder.
<code>
<!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">
<ui:style>
.login {
margin:0px auto
}
</ui:style>
<g:HTMLPanel width="100%">
<g:AbsolutePanel height="257px" styleName="{style.login}">
<g:at left="107" top="10">
<g:Image width="230px" height="106px" url="images/ima-logo.png"/>
</g:at>
<g:at left="84" top="127">
<g:Label text="USER" width="95px" height="18px" horizontalAlignment="ALIGN_RIGHT"/>
</g:at>
<g:at left="84" top="157">
<g:Label text="PASSWORD" width="95px" height="18px" horizontalAlignment="ALIGN_RIGHT"/>
</g:at>
<g:at left="185" top="152">
<g:PasswordTextBox ui:field="password" width="163px" height="20px" tabIndex="2"/>
</g:at>
<g:at left="185" top="122">
<g:TextBox ui:field="username" width="163px" height="20px" tabIndex="1"/>
</g:at>
<g:at left="194" top="202">
<g:Button ui:field="login" width="62px" height="24px" tabIndex="3">LOGIN</g:Button>
</g:at>
<g:at left="21" top="232">
<g:Label ui:field="errorMessage" text="" width="404px" height="20px" wordWrap="true"/>
</g:at>
</g:AbsolutePanel>
</g:HTMLPanel>
</ui:UiBinder>
</code>
