索引
数据绑定意味将Data
图元的数据模型信息,与界面图形的颜色、大小和角度等可视化参数进行自动同步,
HT
的预定于图形组件默认就已与DataModel
中的Data
数据绑定,例如用户修改Node
的position
位置值,
则GraphView
和Graph3dView
上的相应图元位置会自动同步变化。
传统的数据绑定有单向绑定和双向绑定的概念,但HT
系统的设计模式使得绑定更加简化易于理解,HT
只有一个DataModel
数据模型,
绑定DataModel
的图形组件并没有组件内部的其他数据模型,所以组件都是如实根据DataModel
来呈现界面效果,因此当用户拖拽图元移动时,
本质也是修改了数据模型中Node
的position
位置值,而该属性变化触发的事件通过模型再次派发到图形组件,引发图形组件根据新的模型信息刷新界面。
HT
的预定义图元都已自动实现数据绑定,本手册要介绍的主要针对自定义矢量、自定义图标和自定义3d模型,这三种可扩展图形展示效果的数据绑定机制,
这三种自定义图形都具有一致的描述与Data
进行数据绑定的json
格式,用户只需要根据HT
指定的规则格式描述好图元参数绑定的Data
属性,
应用中只需要更新Data
上的数据,图形界面就会自动刷新,从而达到实时显示数据的效果。
绑定的格式很简单,只需将以前的参数值用一个带func
属性的对象替换即可,func
的内容有以下几种类型:
function
类型,直接调用该函数,并传入相关Data
和view
对象,由函数返回值决定参数值,即func(data, view);
调用。string
类型:style@***
开头,则返回data.getStyle(***)
值,其中***
代表style
的属性名。attr@***
开头,则返回data.getAttr(***)
值,其中***
代表attr
的属性名。field@***
开头,则返回data.***
值,其中***
代表data
的属性名。string
类型作为data
对象的函数名调用data.***(view),返回值作为参数值。除了func
属性外,还可设置value
属性作为默认值,如果对应的func
取得的值为undefined
或null
时,则会采用value
属性定义的默认值。
例如以下代码,如果对应的Data
对象的attr
属性stateColor
为undefined
或null
时,则会采用yellow
颜色:
color: {
func: 'attr@stateColor',
value: 'yellow'
}
数据绑定是HT
系统矢量比传统矢量描述格式如SVG灵活强大的重要因素,
上文描述的所有矢量组件属性全部可以设置成动态绑定Data
模型属性。因此一般的工作流程为:先手工或者采用矢量编辑工具生成矢量json
信息,
将需要动态变化的参数设计成数据绑定的格式。运行中只需要修改Data
中绑定图形的相关属性,则矢量会自动将绑定的属性值,
转换显示为相应的颜色,大小,角度等图形信息,最终达到松耦合的数据可视化流程架构。
上例子中:
hollow: {func: 'style@isHollow'}
将pieChart
的hollow
属性,绑定到Node
对象的style
属性isHollow
上startAngle: {func: 'attr@angle'}
将pieChart
的startAngle
属性,绑定到了Node
对象的attr
属性angle
上height: { func: 'field@_height' }
将pieChart
的height
属性,绑定到了Node
对象的field
属性_height
上width: { func: 'getWidth' }
将pieChart
的width
属性,绑定到了Node
对象的方法getWidth
上rect: { func: function (data) { return [5, 5, 190, 190]; } }
将pieChart
的rect
属性,绑定到了func
属性指定的方法上 下例展示了颜色background
,宽度borderWidth
,旋转角度rotation
和可见visible
多种类型属性,
与Data
图元attr
属性的数据绑定。
background: {
value: '#2C3E50',
func: 'attr@switch.background'
},
visible: {
value: true,
func: 'attr@switch.visible'
}
borderWidth: {
value: 8,
func: 'attr@switch.thickness'
},
rotation: {
value: -Math.PI/4,
func: 'attr@switch.angle'
}
图标用于呈现在图元周围作为附属物的展示方式,可参见入门手册 和3D手册的说明,定义图标的参数皆可采用数据绑定的描述方式实现动态变化。
node.addStyleIcon('alarm', {
names: ['alarm-star', 'alarm-triangle', 'alarm-circle'],
position: {func: 'attr@alarm.position'},
direction: { func: 'attr@alarm.direction' },
gap: { func: 'attr@alarm.gap' },
width: { func: 'attr@alarm.width' },
height: { func: 'attr@alarm.height' },
visible: { func: 'attr@alarm.visible' },
rotation: { func: 'attr@alarm.rotation' },
stretch: { func: 'attr@alarm.stretch' },
opacity: { func: 'attr@alarm.opacity' },
transparent: { func: function(data){ return data.a('alarm.opacity') < 1; } },
light: { func: 'attr@alarm.light' },
textureScale: { func: 'attr@alarm.texture.scale' },
discardSelectable: { func: 'attr@alarm.discard.selectable' },
r3: { func: function(data) { return [0, 0, -data.a('alarm.rotation')]; } },
face: { func: 'attr@alarm.face' },
reverseFlip: { func: 'attr@alarm.reverse.flip' },
reverseCull: { func: 'attr@alarm.reverse.cull' },
reverseColor: { func: 'attr@alarm.reverse.color' },
autorotate: { func: 'attr@alarm.autorotate' }
});
建模手册中介绍的自定义3D
模型也支持数据绑定机制,
可数据绑定是HT
的建模远强大于传统3D
建模工具的特色功能,构建模型的任何颜色、大小、旋转等参数皆可绑定Data
数据模型属性,
以这样的方式建模后用户只需要更新Data
数据对象属性值,则3D
界面对应图元的呈现效果即可实时同步更新。
以上例子注册的ems-block
模型由一个立方体和一个圆筒构造,两个模型的颜色分别绑定了Data
上attr
属性的circleColor
和rectColor
值:
ht.Default.setShape3dModel('ems-block', [
{
shape3d: ht.Default.createCylinderModel(32, 0, 32, false, false, true, true),
r3: [Math.PI/2, 0, 0],
color: {
func: 'attr@circleColor',
value: '#3498DB'
}
},
{
shape3d: 'box',
s3: [1, 0.2, 1],
t3: [0, -0.7, 0],
color: {
func: 'attr@rectColor',
value: '#3498DB'
}
}
]);
HT
的所有通用组件也都支持对矢量图片的渲染,该例子中左侧TreeView
显示的正是实现了数据绑定的矢量图标,
Graph3dView
和TreeView
的组件都绑定了同样的数据源,因此修改Data
上attr
属性的circleColor
和rectColor
可同时驱动不同的视图组件。
ht.Default.setImage('ems-block', {
width: 18,
height: 18,
comps: [
{
type: 'circle',
rect: [0, 2, 18, 10],
background: {
func: 'attr@circleColor',
value: '#3498DB'
}
},
{
type: 'rect',
rect: [4, 14, 10, 3],
background: {
func: 'attr@rectColor',
value: '#3498DB'
}
}
]});
icons
图标功能不仅可显示平面图片,也支持将注册的模型作为图标摆放。以上例子在Node
图元顶上摆放了一个3d
模型的图标,
该模型有三个部分构成一个告警提示,模型三个部分的颜色绑定了图元style
属性的all.blend
值,模型的旋转角度绑定了alarm.rotation.*
。
var array = [
{
shape3d: ringModel,
color: { func: 'style@all.blend' },
r3: [Math.PI/2, 0, 0]
},
{
shape3d: sphereModel,
color: { func: 'style@all.blend' },
t3: [0, 30, 0]
},
{
shape3d: cylinderModel,
color: { func: 'style@all.blend' },
t3: [0, -10, 0]
}
];
ht.Default.setShape3dModel('alarm', {
shape3d: array,
t3: [0, 50, 0],
r3: {func: function(data){
return [
data.a('alarm.rotation.x'),
data.a('alarm.rotation.y'),
data.a('alarm.rotation.z')];
}}
});
图标为3d
模型时不同于传统的通过names
定义图标数组,而是设置shape3d
的模型名称,目前还不支持数组方式,
只允许指定一个模型名称,如需添加多个3d
模型图标可通过多次调用addStyleIcon
实现:
node.addStyleIcon('alarm', {
position: 3,
face: 'center',
shape3d: 'alarm'
});