简介
数据控件.
数据控件可与数据集(DataSet)进行绑定,用于控制或显示数据集中的数据。
主要用于跟DataSet中的数据实体(dorado.Entity)或数据实体的集合(dorado.EntityList)进行绑定。
属性说明
dataSet
用于设定要绑定的数据集
dataPath
数据路径,用于指定数据控件与数据集中的哪些数据节点进行关联。
DataPath概念详细说明参考:
DataControl根据自身特性dataPath所指向的数据结构分两种类型:
显示一个集合类对象
如:DataGrid, DataSetDropDown, DataTree, DataBlockView, DataPilot;
对于集合类的数据绑定对象,其DataPath所指向的数据都必须是一个集合类型,而不能是一个独立的实体对象。
假设我们现在有一组如下结构的Entit+EntityList数据,其中包含Department和Employee两种实体类型,其中Department支持递归嵌套。下面的说明和示例都将围绕这组数据展开。
[ { id: "D1", name: "XX部1", departments: [ { id: "D11", name: "XX部2", employees: [ { id: "0001", name: "John", sex: "male", salary: 5000 }, ... ] }, ... ] }, ... ]
则dataPath正确的配置实例有:
- null(即空) - 相当于直接返回被查询的数据。表示顶层集合中所有的(不包含被删除的)Department。
- * - 同上。
- [#dirty] - 表示顶层集合中所有在客户端被改变过的(包含被删除的)Department。
- #.employees - 表示顶层集合中当前Department中所有的Employee。
- *.departments - 表示所有第二层的Department。
- .departments - 同上。
- departments(repeat) - 表示所有Department的集合。注意:示例数据的顶层是一个集合,而在正常情况下是不能利用表达式来获取集合属性的。除非当一个具有repeat或leaf特性的表达式片段被应用于顶层集合时。引擎允许这样的特例,在此种情况下引擎会暂时忽略表达式片段中的属性名。
- .departments(R) - 表示除顶层Department外所有其它Department的集合。
- .#departments(R) - 表示除顶层Department外所有其它各层中当前Department的集合。
- #departments(R) - 表示各层当前Department的集合。
- .employees(R) - 表示所有employees属性中的对象的集合,即所有的Employee对象。
- .#employees(R) - 表示所有Department中的当前Employee,将以数组的形式返回这些Employee实体的集合。
- .employees(R)[@.get("sex")=="male"] - 表示所有Department中的男性Employee,将以数组的形式返回这些Employee实体的集合。
- .employees(R)[#dirty,@.get("sex")=="male"] - 表示所有Department中的状态为已修改的男性Employee,将以数组的形式返回这些Employee实体的集合。
- .employees(R)[@.get("salary")>3500 && @.get("sex")=="male"] - 同上。
- .employees(R)[@.get("salary")>3500, @.get("sex")=="male"] - 表示所有Department中的薪水高于3500的男性Employee,将以数组的形式返回这些Employee实体的集合。
在前面的DataPath中我们接触到了当前实体的概念,在DataPath中以“#”表示。与之对应的数据绑定控件在表现形式上也有所体现,如:产品名称为"Milestone"的行为DataGrid的当前行。
DataBlockView中名称为"Sweetcakes"对应的块为当前块:
DataTree中"数据表格"节点为当前节点:
上面几个实例图中背景色为绿色的选择对象就是DataPath中的当前记录的概念。
有关当前记录的详细概念请参考:
显示单实体对象的一个属性
如:DataLabel, TextEditor, CheckBox, TextArea;
同上那个JSON对象的声明:
假设我们现在有一组如下结构的Entit+EntityList数据,其中包含Department和Employee两种实体类型,其中Department支持递归嵌套。下面的说明和示例都将围绕这组数据展开。
[ { id: "D1", name: "XX部1", departments: [ { id: "D11", name: "XX部2", employees: [ { id: "0001", name: "John", sex: "male", salary: 5000 }, ... ] }, ... ] }, ... ]
则dataPath正确的配置实例有:
- # - 表示顶层集合中的当前Department。
- [#current] - 同上。
- #.#employees - 表示顶层集合中当前Department中的当前Employee。
- #.#departments.#employees - 表示顶层集合中当前Department中的当前Employee。
- #departments(leaf) - 表示最末端的当前Department。即通过不断的尝试获取当前Department中的当前Department,直到最末端那个Department。
- #departments(L) - 同上。
该类对象除了需要设置dataSet和dataPath属性外,还需要设定property属性,用于与实体对象的具体属性绑定:
由于EntityList具有当前记录的概念,对应DataLabel, TextEditor, CheckBox, TextArea这种显示单实体对象的某个属性的控件而言,其dataPath还支持集合类型的返回结果,只要确保这个集合类是一个EntityList,并且有当前记录。上述控件就会自动的将对应EntityList的当前记录作为要显示的实体对象。
根据这个原理,如下的dataPath设置也是正确的:
- null(即空) - 相当于直接返回被查询的数据。表示顶层集合中所有的(不包含被删除的)Department。
- * - 同上。
- #.employees - 表示顶层集合中当前Department中所有的Employee。
- *.departments - 表示所有第二层的Department。
- .departments - 同上。
但是如下的dataPath设置却是不正确的:
dataPath | 原因 |
---|---|
departments(repeat) - 表示所有Department的集合 | 可能不止一个当前Department |
[#dirty] - 表示顶层集合中所有在客户端被改变过的(包含被删除的)Department。 | 可能没有当前Department |
.departments(R) - 表示除顶层Department外所有其它Department的集合。 | 可能不止一个当前Department |
.#departments(R) - 表示除顶层Department外所有其它各层中当前Department的集合。 | 都是当前Department |
#departments(R) - 表示各层当前Department的集合 | 都是当前Department |
.employees(R) - 表示所有employees属性中的对象的集合,即所有的Employee对象 | 可能不止一个当前Employee |
.#employees(R) - 表示所有Department中的当前Employee,将以数组的形式返回这些Employee实体的集合。 | 返回的是数组,不是EntityList |
.employees(R)[@.get("sex")=="male"] - 表示所有Department中的男性Employee,将以数组的形式返回这些Employee实体的集合。 | 返回的是数组,不是EntityList |
.employees(R)[#dirty,@.get("sex")=="male"] - 表示所有Department中的状态为已修改的男性Employee,将以数组的形式返回这些Employee实体的集合。 | 返回的是数组,不是EntityList |
.employees(R)[@.get("salary")>3500 && @.get("sex")=="male"] - 同上 | 返回的是数组,不是EntityList |
.employees(R)[@.get("salary")>3500, @.get("sex")=="male"] - 表示所有Department中的薪水高于3500的男性Employee,将以数组的形式返回这些Employee实体的集合 | 返回的是数组,不是EntityList |
Attachments:



