SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
Martin Wittemann
martin.wittemann@1und1.de




             Form Management
                            in qooxdoo 0.8.3
qooxdoo <= 0.8.2

! Complete set of widgets
!
" Uniform API (interfaces) for the widgets
!
" Validation
!
" Resetting support
!
" Form rendering
!
" Serialization
!
" Data binding for the form
!
qooxdoo > 0.8.2

! Complete set of widgets
!
! Uniform API (interfaces) for the widgets
!
! Validation
!
! Resetting support
!
! Form rendering
!
! Serialization
!
! Data binding for the form
!
Uniform API
• New Interfaces for ...
  • Widgets with invalid states
  • Executable widgets
  • Range handling widgets
  • Widgets containing a value
  • Widgets representing some kind of
    data
Value Interfaces
           <<interface>>                               <<interface>>
          INumberForm                                  IStringForm
changeValue : Data                          changeValue : Data

setValue(value : number) : void             setValue(value : string) : void
getValue() : number                         getValue() : string
resetValue() : void                         resetValue() : void


           <<interface>>                               <<interface>>
            IDateForm                                   IColorForm
changeValue : Data                          changeValue : Data

setValue(value : Date) : void               setValue(value : Color) : void
getValue() : Date                           getValue() : Color
resetValue() : void                         resetValue() : void


                                 <<interface>>
                                IBooleanForm
                      changeValue : Data

                      setValue(value : boolean) : void
                      getValue() : boolean
                      resetValue() : void
Why?
var   label = new qx.ui.basic.Label();
var   textField = new qx.ui.form.TextField();
var   dateField = new qx.ui.form.DateField();
var   checkBox = new qx.ui.form.CheckBox();

label.setContent("a");
textField.setValue("a");
dateField.setDate(new Date());
checkBox.setValue("a"); //string representation
checkBox.setChecked(true);


var spinner = new qx.ui.form.Spinner();
var slider = new qx.ui.form.Slider();

spinner.setMin(10);
slider.setMinimum(10);
Better...
var   label = new qx.ui.basic.Label();
var   textField = new qx.ui.form.TextField();
var   dateField = new qx.ui.form.DateField();
var   checkBox = new qx.ui.form.CheckBox();

label.setValue("a");
textField.setValue("a");
dateField.setValue(new Date());
checkBox.setValue(true);



var spinner = new qx.ui.form.Spinner();
var slider = new qx.ui.form.Slider();

spinner.setMinimum(10);
slider.setMinimum(10);
But I liked the old value
• Often used for storing representing data
• Was too strict because only Strings were
  allowed
But I liked the old value
 • Often used for storing representing data
 • Was too strict because only Strings were
      allowed

                        <<Interface>>
                            IModel
           changeModel : Data
           setModel(value : var) : void
           getModel() : var
           resetModel() : void



ListItem                                        CheckBox
                Abstract
                                  RadioButton
                TreeItem
But I liked the old value
• Often used for storing representing data
• Was too strict because only Strings were
  allowed




                                                            <<Interface>>
                                                                IModel
                                               changeModel : Data
                                               setModel(value : var) : void
                                               getModel() : var
                                               resetModel() : void



                                    ListItem                                        CheckBox
                                                    Abstract
                                                                      RadioButton
                                                    TreeItem
But I liked the old value
      • Often used for storing representing data
      • Was too strict because only Strings were
             allowed
                           <<Interface>>
                         IModelSelection
                setModelSelection(value : var) : void
                getModelSelection() : var




RadioGroup                                                 Tree                           <<Interface>>

              RadioButton                                                                     IModel
                                                                             changeModel : Data
                                               SelectBox                     setModel(value : var) : void
                Group                                                        getModel() : var
                                  List                                       resetModel() : void



                                                                  ListItem                                        CheckBox
                                                                                  Abstract
                                                                                                    RadioButton
                                                                                  TreeItem
Visualize Invalid
Visualize Invalid
Validation

• Validation Manager
 • Synchronous validation
 • Asynchronous validation
 • Validation of items in the form
   context

 • Predefined validators
Sync
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

textField.setRequired(true);
manager.add(textField);
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
manager.add(textField);
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
                       function(value) {
manager.add(textField); 3;
  return value.length >=
});
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.setValidator(function(items) { {
manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
                       function(value)
manager.add(textField); 3;{
  if (checkBox.getValue())
  return value.length >=
}); var value = textField.getValue();
    if (!value || value.length == 0) {
      textField.setValid(false);
      return false;
    }
  }
  textField.setValid(true);
  return true;
});
Async
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField,
   new qx.ui.form.validation.AsyncValidator(
     function(validator, value) {
       // here comes the async call
       window.setTimeout(function() {
         // callback for the async validation
         validator.setValid(false);
       }, 1000);
     }
   )
);
Async
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField,
   new qx.ui.form.validation.AsyncValidator(
     function(validator, value) {
       // here comes the async call
       window.setTimeout(function() {
         // callback for the async validation
         validator.setValid(false);
       }, 1000);
     }
   )
);
Resetting

• Resetting of all form items at once
• Support for form items using
  selections (List, SelectBox, ...)
Resetting

• Resetting of all form items at once
• Support for form items using
  selections (List, SelectBox, ...)

                  qx.ui.form.Resetter
          add(item : qx.ui.form.IForm) : void
          redefine() : void
          reset() : void
Rendering

• Form
 • Uses a renderer interface
 • Different default renderer available
 • Combines rendering, validation and
   resetting

 • Handles form items and buttons
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Renderer
this.getRoot().add(
   form.createView(),
   {left: 10, top: 10}
);
Renderer
this.getRoot().add(
   form.createView(),
   {left: 10, top: 10}
);




        Single
Renderer
this.getRoot().add(
   form.createView(),
   form.createView(qx.ui.form.renderer.SinglePlaceholder),
   {left: 10, top: 10}
);




        Single                       SinglePlaceholder
Renderer
this.getRoot().add(
   form.createView(),
   form.createView(qx.ui.form.renderer.Double),
   form.createView(qx.ui.form.renderer.SinglePlaceholder),
   {left: 10, top: 10}
);




        Single                       SinglePlaceholder




                         Double
Serialization

• Change of the serialization
  perspective
• Serialization of a model and not of a
  view
" Moved into the data binding layer
Data Binding


• Special controller for the form
  • Connecting a model with the form
  • Creating a model
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Model


• qooxdoo class with three properties
  • salutation
  • firstName
  • last
Serialization
     • to URI parameter
qx.util.Serializer.toUriParameter(model);

Salutation=Mr.&FirstName=Martin&last=Wittemann


• to JSON
qx.util.Serializer.toJSON(model);

{
    "Salutation":"Mr.",
    "FirstName": "Martin",
    "last": "Wittemann"
}
More...

• Wiki Documentation
 • Complete list of all changed widgets
 • Complete list of all interfaces
 • Further details on the new parts
 http://qooxdoo.org/documentation/
 0.8/ui_form_handling2#interfaces

Weitere ähnliche Inhalte

Was ist angesagt?

Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesAndrás Papp
 
Wicket KT part 2
Wicket KT part 2Wicket KT part 2
Wicket KT part 2stuq
 
Postgres rules
Postgres rulesPostgres rules
Postgres rulesgisborne
 
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...Ontico
 
Unit Testing at Scale
Unit Testing at ScaleUnit Testing at Scale
Unit Testing at ScaleJan Wloka
 
rails-migrations_1
rails-migrations_1rails-migrations_1
rails-migrations_1brecke
 
11. session 11 functions and objects
11. session 11   functions and objects11. session 11   functions and objects
11. session 11 functions and objectsPhúc Đỗ
 
The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84Mahmoud Samir Fayed
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue AdventureAllegient
 
jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0guest644d1d
 

Was ist angesagt? (15)

Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservices
 
Wicket KT part 2
Wicket KT part 2Wicket KT part 2
Wicket KT part 2
 
Postgres rules
Postgres rulesPostgres rules
Postgres rules
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
 
Unit Testing at Scale
Unit Testing at ScaleUnit Testing at Scale
Unit Testing at Scale
 
rails-migrations_1
rails-migrations_1rails-migrations_1
rails-migrations_1
 
Developer Testing Tools Roundup
Developer Testing Tools RoundupDeveloper Testing Tools Roundup
Developer Testing Tools Roundup
 
jQuery
jQueryjQuery
jQuery
 
11. session 11 functions and objects
11. session 11   functions and objects11. session 11   functions and objects
11. session 11 functions and objects
 
Spine JS
Spine JSSpine JS
Spine JS
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
 
jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0
 

Andere mochten auch

EstablishUS Overview Presentation
EstablishUS Overview PresentationEstablishUS Overview Presentation
EstablishUS Overview Presentationmdskelton
 
qooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparisonqooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-ComparisonMartin Wittemann
 
History of Ska Presentation
History of Ska PresentationHistory of Ska Presentation
History of Ska Presentationguestff60a
 
Skinheads presentation in powerpoint
Skinheads presentation in powerpointSkinheads presentation in powerpoint
Skinheads presentation in powerpointpatricia295
 

Andere mochten auch (8)

EstablishUS Overview Presentation
EstablishUS Overview PresentationEstablishUS Overview Presentation
EstablishUS Overview Presentation
 
qooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparisonqooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparison
 
qooxdoo Decorators
qooxdoo Decoratorsqooxdoo Decorators
qooxdoo Decorators
 
Zebulon Solutions
Zebulon SolutionsZebulon Solutions
Zebulon Solutions
 
History of Ska Presentation
History of Ska PresentationHistory of Ska Presentation
History of Ska Presentation
 
PresentacióN2
PresentacióN2PresentacióN2
PresentacióN2
 
Skinheads presentation in powerpoint
Skinheads presentation in powerpointSkinheads presentation in powerpoint
Skinheads presentation in powerpoint
 
Skinheads
SkinheadsSkinheads
Skinheads
 

Ähnlich wie qooxdoo Form Management

Cocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersCocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersStijn Willems
 
Scala in practice
Scala in practiceScala in practice
Scala in practicepatforna
 
Viastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetViastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetimdurgesh
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montageKris Kowal
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196Mahmoud Samir Fayed
 
Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Marius Bugge Monsen
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsRichie Rump
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgetsscottw
 
.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkitwlscaudill
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami
 
GWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTGWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTniloc132
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web appsIvano Malavolta
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."sjabs
 
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJava Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJAX London
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejsNick Lee
 

Ähnlich wie qooxdoo Form Management (20)

Cocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersCocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollers
 
Developing a new Epsilon EMC driver
Developing a new Epsilon EMC driverDeveloping a new Epsilon EMC driver
Developing a new Epsilon EMC driver
 
Requery overview
Requery overviewRequery overview
Requery overview
 
Linq
LinqLinq
Linq
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
IN4308 Lecture 3
IN4308 Lecture 3IN4308 Lecture 3
IN4308 Lecture 3
 
Viastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetViastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheet
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montage
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196
 
Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)
 
Jsr 303
Jsr 303Jsr 303
Jsr 303
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic Unicorns
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgets
 
.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkit
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
 
GWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTGWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXT
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web apps
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
 
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJava Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejs
 

Mehr von Martin Wittemann

Mehr von Martin Wittemann (6)

10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
 
Pointer events
Pointer eventsPointer events
Pointer events
 
qooxdoo 3.5
qooxdoo 3.5qooxdoo 3.5
qooxdoo 3.5
 
Cross-Platform Mobile Apps
Cross-Platform Mobile AppsCross-Platform Mobile Apps
Cross-Platform Mobile Apps
 
Qooxdoo at B::IT
Qooxdoo at B::ITQooxdoo at B::IT
Qooxdoo at B::IT
 
Data Binding in qooxdoo
Data Binding in qooxdooData Binding in qooxdoo
Data Binding in qooxdoo
 

Kürzlich hochgeladen

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Kürzlich hochgeladen (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

qooxdoo Form Management

  • 1. Martin Wittemann martin.wittemann@1und1.de Form Management in qooxdoo 0.8.3
  • 2. qooxdoo <= 0.8.2 ! Complete set of widgets ! " Uniform API (interfaces) for the widgets ! " Validation ! " Resetting support ! " Form rendering ! " Serialization ! " Data binding for the form !
  • 3. qooxdoo > 0.8.2 ! Complete set of widgets ! ! Uniform API (interfaces) for the widgets ! ! Validation ! ! Resetting support ! ! Form rendering ! ! Serialization ! ! Data binding for the form !
  • 4. Uniform API • New Interfaces for ... • Widgets with invalid states • Executable widgets • Range handling widgets • Widgets containing a value • Widgets representing some kind of data
  • 5. Value Interfaces <<interface>> <<interface>> INumberForm IStringForm changeValue : Data changeValue : Data setValue(value : number) : void setValue(value : string) : void getValue() : number getValue() : string resetValue() : void resetValue() : void <<interface>> <<interface>> IDateForm IColorForm changeValue : Data changeValue : Data setValue(value : Date) : void setValue(value : Color) : void getValue() : Date getValue() : Color resetValue() : void resetValue() : void <<interface>> IBooleanForm changeValue : Data setValue(value : boolean) : void getValue() : boolean resetValue() : void
  • 6. Why? var label = new qx.ui.basic.Label(); var textField = new qx.ui.form.TextField(); var dateField = new qx.ui.form.DateField(); var checkBox = new qx.ui.form.CheckBox(); label.setContent("a"); textField.setValue("a"); dateField.setDate(new Date()); checkBox.setValue("a"); //string representation checkBox.setChecked(true); var spinner = new qx.ui.form.Spinner(); var slider = new qx.ui.form.Slider(); spinner.setMin(10); slider.setMinimum(10);
  • 7. Better... var label = new qx.ui.basic.Label(); var textField = new qx.ui.form.TextField(); var dateField = new qx.ui.form.DateField(); var checkBox = new qx.ui.form.CheckBox(); label.setValue("a"); textField.setValue("a"); dateField.setValue(new Date()); checkBox.setValue(true); var spinner = new qx.ui.form.Spinner(); var slider = new qx.ui.form.Slider(); spinner.setMinimum(10); slider.setMinimum(10);
  • 8. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed
  • 9. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModel changeModel : Data setModel(value : var) : void getModel() : var resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 10. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModel changeModel : Data setModel(value : var) : void getModel() : var resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 11. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModelSelection setModelSelection(value : var) : void getModelSelection() : var RadioGroup Tree <<Interface>> RadioButton IModel changeModel : Data SelectBox setModel(value : var) : void Group getModel() : var List resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 14. Validation • Validation Manager • Synchronous validation • Asynchronous validation • Validation of items in the form context • Predefined validators
  • 15. Sync
  • 16. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); textField.setRequired(true); manager.add(textField);
  • 17. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); manager.add(textField);
  • 18. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); function(value) { manager.add(textField); 3; return value.length >= });
  • 19. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.setValidator(function(items) { { manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); function(value) manager.add(textField); 3;{ if (checkBox.getValue()) return value.length >= }); var value = textField.getValue(); if (!value || value.length == 0) { textField.setValid(false); return false; } } textField.setValid(true); return true; });
  • 20. Async var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, new qx.ui.form.validation.AsyncValidator( function(validator, value) { // here comes the async call window.setTimeout(function() { // callback for the async validation validator.setValid(false); }, 1000); } ) );
  • 21. Async var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, new qx.ui.form.validation.AsyncValidator( function(validator, value) { // here comes the async call window.setTimeout(function() { // callback for the async validation validator.setValid(false); }, 1000); } ) );
  • 22. Resetting • Resetting of all form items at once • Support for form items using selections (List, SelectBox, ...)
  • 23. Resetting • Resetting of all form items at once • Support for form items using selections (List, SelectBox, ...) qx.ui.form.Resetter add(item : qx.ui.form.IForm) : void redefine() : void reset() : void
  • 24. Rendering • Form • Uses a renderer interface • Different default renderer available • Combines rendering, validation and resetting • Handles form items and buttons
  • 25. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 26. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 27. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 28. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 29. Renderer this.getRoot().add( form.createView(), {left: 10, top: 10} );
  • 30. Renderer this.getRoot().add( form.createView(), {left: 10, top: 10} ); Single
  • 31. Renderer this.getRoot().add( form.createView(), form.createView(qx.ui.form.renderer.SinglePlaceholder), {left: 10, top: 10} ); Single SinglePlaceholder
  • 32. Renderer this.getRoot().add( form.createView(), form.createView(qx.ui.form.renderer.Double), form.createView(qx.ui.form.renderer.SinglePlaceholder), {left: 10, top: 10} ); Single SinglePlaceholder Double
  • 33. Serialization • Change of the serialization perspective • Serialization of a model and not of a view " Moved into the data binding layer
  • 34. Data Binding • Special controller for the form • Connecting a model with the form • Creating a model
  • 35. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 36. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 37. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 38. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 39. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 40. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 41. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 42. Model • qooxdoo class with three properties • salutation • firstName • last
  • 43. Serialization • to URI parameter qx.util.Serializer.toUriParameter(model); Salutation=Mr.&FirstName=Martin&last=Wittemann • to JSON qx.util.Serializer.toJSON(model); { "Salutation":"Mr.", "FirstName": "Martin", "last": "Wittemann" }
  • 44. More... • Wiki Documentation • Complete list of all changed widgets • Complete list of all interfaces • Further details on the new parts http://qooxdoo.org/documentation/ 0.8/ui_form_handling2#interfaces