我这里假设 JSON 数据代表了各种动态数据,不能简单地使用像网格这样的预置控件,或者固定的形式。
您需要做的是制作自己的容器类,它会根据 JSON 内容动态创建小部件。当然,你必须自己写这个。
一个极端是让您在商店中的 JSON 内容成为有效的参数,例如,Ext.widget
但这可能是不可行的,甚至是不可取的。
对于更中等的位置,使用 JSON 数据根据条件确定要添加的小部件。
作为一个粗略的大纲,你想要这样的东西:
Ext.define('MyFormContainer', {
extend: 'Ext.form.FormPanel',
config: {
// A store or MixedCollection of JSON data objects, keyable by id.
formData: null
},
layout: 'vbox',
initComponent: function() {
this.callParent(arguments);
this.getFormData().each(this.addField, this)
},
addField: function(fieldData) {
var widgetConfig = this.buildWidgetConfig(fieldData);
this.add(widgetConfig);
},
buildWidgetConfig: function(fieldData) {
// The heart of the factory. You need a way to determine what sort of widget to make for
// the field. For the example config, a fieldset with three fields would probably be
// appropriate:
var fieldSet = { xtype: 'fieldset', layout: 'hbox' };
var items = [];
items[0] = { xtype: 'textfield', name: fieldData['FieldName'] };
// this would be a link to a custom widget to handle the operator. Or maybe you could
// just spit out text, if it's not meant to be alterable.
items[1] = { xtype: 'myoperator_' + fieldData['operator'], name: 'operator' };
items[2] = { xtype: fieldData['widget'], name: 'value' }
fieldSet.items = items;
return fieldSet;
}
})
这是一个简单而人为的示例,但它应该(在您填写空白后,例如缺少要求和自定义操作员小部件)基于 JSON 数据呈现表单。
(我个人使用这种方法——我可以在一个简单的例子中展示更复杂的方法——根据服务器提供的表单描述生成动态表单)