Hi Isomorphic,
I'm having problems to figure out if I should always get my DSCallback executed for validateData(). This does not happen in my application.
I prepared a testcase (v10.1p_2016-03-17 BuilInDS based), which showed another anomaly.
For one of my validateData(), there are actually two requests sent.
See this testcase:
employees.ds.xml change/addition:
BuiltInDS.java:
Please click the 1st validateData() to see the double request.
Am I always guaranteed a CallBack-execution when I use validateData() (this is my main question)?
Best regards
Blama
I'm having problems to figure out if I should always get my DSCallback executed for validateData(). This does not happen in my application.
I prepared a testcase (v10.1p_2016-03-17 BuilInDS based), which showed another anomaly.
For one of my validateData(), there are actually two requests sent.
See this testcase:
employees.ds.xml change/addition:
Code:
<field name="Job" title="Title" type="text" length="128">
<validators>
<validator type="isUnique" serverOnly="true" />
</validators>
</field>
<operationBindings>
<operationBinding operationType="fetch" operationId="fetchFewColumns" outputs="EmployeeId, Name, Gender" />
</operationBindings>
Code:
package com.smartgwt.sample.client;
import com.google.gwt.core.client.EntryPoint;
import com.smartgwt.client.Version;
import com.smartgwt.client.core.KeyIdentifier;
import com.smartgwt.client.data.AdvancedCriteria;
import com.smartgwt.client.data.Criterion;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.OperatorId;
import com.smartgwt.client.util.Page;
import com.smartgwt.client.util.PageKeyHandler;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
public class BuiltInDS implements EntryPoint {
private VLayout mainLayout;
private IButton recreateBtn;
public void onModuleLoad() {
KeyIdentifier debugKey = new KeyIdentifier();
debugKey.setCtrlKey(true);
debugKey.setKeyName("D");
Page.registerKey(debugKey, new PageKeyHandler() {
public void execute(String keyName) {
SC.showConsole();
}
});
mainLayout = new VLayout(20);
mainLayout.setWidth100();
mainLayout.setHeight100();
recreateBtn = new IButton("Recreate");
recreateBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
recreate();
}
});
mainLayout.addMember(recreateBtn);
recreate();
mainLayout.draw();
}
private void recreate() {
Window w = new Window();
w.setWidth("95%");
w.setHeight("95%");
w.setMembersMargin(0);
w.setModalMaskOpacity(70);
w.setTitle(" (" + Version.getVersion() + "/" + Version.getSCVersionNumber() + ")");
w.setTitle("TITLE" + w.getTitle());
w.setShowMinimizeButton(false);
w.setIsModal(true);
w.setShowModalMask(true);
w.centerInPage();
{
final MyDynamicForm df1 = new MyDynamicForm(true, false);
IButton v1 = new IButton("validate()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df1.validate();
}
});
IButton vd1 = new IButton("validateData()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df1.validateData(new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
SC.logWarn("form1.validateData() returned");
}
});
}
});
LayoutSpacer ls1 = new LayoutSpacer();
w.addItem(df1);
w.addItem(v1);
w.addItem(vd1);
w.addItem(ls1);
}
{
final MyDynamicForm df2 = new MyDynamicForm(false, false);
IButton v2 = new IButton("validate()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df2.validate();
}
});
IButton vd2 = new IButton("validateData()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df2.validateData(new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
SC.logWarn("form2.validateData() returned");
}
});
}
});
LayoutSpacer ls2 = new LayoutSpacer();
w.addItem(df2);
w.addItem(v2);
w.addItem(vd2);
w.addItem(ls2);
}
{
final MyDynamicForm df3 = new MyDynamicForm(false, true);
IButton v3 = new IButton("validate()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df3.validate();
}
});
IButton vd3 = new IButton("validateData()", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
df3.validateData(new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
SC.logWarn("form3.validateData() returned");
}
});
}
});
w.addItem(df3);
w.addItem(v3);
w.addItem(vd3);
}
w.show();
}
private class MyDynamicForm extends DynamicForm {
public MyDynamicForm(boolean useJob, boolean fewColumns) {
super();
this.setDataSource(DataSource.get("employees"));
if (fewColumns)
this.setFetchOperation("fetchFewColumns");
this.setAutoFetchData(false);
this.setCanEdit(true);
HiddenItem employeeId = new HiddenItem("EmployeeId");
FormItem name = new FormItem("Name");
FormItem gender = new FormItem("Gender");
FormItem job = new FormItem("Job");
if (useJob)
this.setFields(employeeId, name, gender, job);
else
this.setFields(employeeId, name, gender);
this.fetchData(new AdvancedCriteria(new Criterion(employeeId.getName(), OperatorId.EQUALS, 4)));
}
}
}[B][/B]
Please click the 1st validateData() to see the double request.
Am I always guaranteed a CallBack-execution when I use validateData() (this is my main question)?
Best regards
Blama
Comment