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