Qooxdoo ComboBox键/值序列化

时间:2015-07-25 16:12:27

标签: javascript data-binding qooxdoo

有人可以举例说明如何在qooxdoo ComboBox或VirtualComboBox中对键值对进行正确的数据序列化吗?

我有这个示例数据[{"label":"","value":"0"},{"label":"Male","value":"m"},{"label":"Female","value":"f"}]

而在标签中我想显示标签,在服务器中我想发送值。

似乎序列化程序使用getValue()函数,该函数只返回文本框的内容。我在这里有一个例子http://tinyurl.com/qcl7pmg但我不知道如何让它发送" M"而不是"男性"。像DemoBrowser http://demo.qooxdoo.org/current/demobrowser/#data~Form.html

这样的例子

1 个答案:

答案 0 :(得分:2)

我在Qooxdoo 1.x(#5469)的几天前报告了一个大约4年前的错误。但它缺乏功能而不是bug。将复杂数据结构绑定到表单并不是一件简单的事情。它需要很好地理解Qooxdoo数据绑定以及它的大量实践。但是,使用qx.ui.form.Form构建qx.data.controller.Form时,它可以提供极大的灵活性和自动化。

关键是您使用qx.data.controller.Form.prototype.addBindingOptions为每个表单窗口小部件设置的绑定选项。它可以控制从模型到小部件的内容,反之亦然。通过一个小技巧,您甚至可以在qx.data.controller.Form下使用Qooxdoo表。

有一个snippet用于将组合框绑定到表单,该表单使用表示列表项的Qooxdoo对象进行操作。

var listData = [
  {"label": "(empty)", "value": "0"},
  {"label": "Male", "value": "m"},
  {"label": "Female", "value": "f"}
];
var listModel = qx.data.marshal.Json.createModel(listData);

var formData = {'gender': listData[0]};
var formModel = qx.data.marshal.Json.createModel(formData);

var form = new qx.ui.form.Form();
var formController = new qx.data.controller.Form(null, form);

var comboBox = new qx.ui.form.ComboBox();
var comboList = comboBox.getChildControl('list');
var listController = new qx.data.controller.List(listModel, comboList, 'label');

form.add(comboBox, 'Gender', null, 'gender');

var genderModelToTargetConverter = function(value, model, sourceObj, targetObj)
{
  if(value instanceof qx.core.Object)
  {
    listController.setSelection(new qx.data.Array([value]));
    return value.getLabel();
  }
  return value;
};
var genderTargetToModelConverter = function(value, model, sourceObj, targetObj)
{
  return listController.getSelection().getItem(0);
};
formController.addBindingOptions(
  'gender', 
  {'converter': genderModelToTargetConverter.bind(this)},
  {'converter': genderTargetToModelConverter.bind(this)}
);
formController.setModel(formModel);

var sendButton = new qx.ui.form.Button('Send');

this.getRoot().add(comboBox, {left: 10, top: 10});
this.getRoot().add(sendButton, {left: 10, top: 50});

sendButton.addListener('execute', function()
{
  var result = qx.util.Serializer.toNativeObject(formModel); 
  console.log(result['gender']);
}, this);

在实践中,不太可能在同一个班级中完成所有操作。它脆弱而复杂。基本上你需要实现一种基于Qooxdoo数据层的MVC。然后事情变得非常清楚和简单。例如,这里是 cherrypy-webapp-skeleton frontend,具有如此简单的实现。