索引
HT for Web提供了列表组件类ht.widget.ListView,用于显示DataModel数据容器中Data类型对象的属性信息,支持排序和过滤等功能。
通过listView = new ht.widget.ListView(dataModel);初始化构建一个列表组件对象,dataModel参数为列表组件绑定的数据模型,
该模型为空时列表组件构造函数内部将创建一个新的数据模型进行绑定。
列表组件类ht.widget.ListView主要可配置属性和函数如下:
enableToolTip()和disableToolTip()开启和关闭文字提示isDisabled()和setDisabled(true/false, iconURL)可获取和设置整个组件处于不可用状态addTopPainter(func)和removeTopPainter(func)增加和删除顶层绘制器function(g){...}addBottomPainter(func)和removeBottomPainter(func)增加和删除底层绘制器function(g){...}getRowHeight()和setRowHeight(20)获取和设置行高isRowLineVisible()和setRowLineVisible(true/false)获取和设置行线是否可见,默认为truegetRowLineColor()和setRowLineColor(color)获取和设置行线颜色getSortFunc()和setSortFunc(sortFunc)获取和设置排序函数getVisibleFunc()和setVisibleFunc()获取和设置可见过滤器,其可过滤DataModel中的Data数据对象getScrollBarColor()和setScrollBarColor(color)获取和设置滚动条颜色getScrollBarSize()和setScrollBarSize(6)获取和设置滚动条宽度isAutoHideScrollBar()和setAutoHideScrollBar(true/false)获取和设置是否自动隐藏滚动条,默认为trueisCheckModel()和setCheckMode(true/false)获取和设置是否为check模式,默认为falsegetCheckIcon(data)返回data对象对应的check图标,可重载自定义check图标,该函数在checkMode模式下有效getFocusData()、setFocusData(data)和setFocusDataById(id)在checkMode模式下图元除了被选中有check状态外,还可以有被点击行的focus状态drawRow(g, data, selected, x, y, width, height)绘制行,可重载自定义行渲染。getDataAt(pointOrEvent)传入逻辑坐标点或交互事件event参数,返回对应的data对象或空getToolTip(event)根据传入的交互事件,返回文本提示信息,可重载自定义onDataDoubleClicked(data, event)当data所在行被双击时回调,可重载对双击事件做响应 onDataClicked(data, event)当data所在行被单击时回调,可重载对单击事件做响应 getLabel(data)返回data对象显示的文字,默认返回data.toLabel(),可重载自定义getIcon(data)返回data对象对应的icon图标,可重载自定义 getLabelFont(data)返回对应的单元格文本字体,可重载自定义getLabelColor(data)返回对应的单元格文本颜色,可重载自定义getSelectBackground(data)和setSelectBackground(color)获取和设置行选中背景颜色getStartRowIndex()返回当前可见区域的起始行索引getEndRowIndex()返回当前可见区域的结束行索引getRowDatas()返回当前显示的Data对象数组,该数组已被排序和过滤getRowIndex(data)返回data对象所在的行索引getRowSize()返回当前可见行总行数isVisible(data)判断data对象是否可见,可重载自定义getDataModel()获取绑定的DatModel数据模型setDataModel(dataModel)绑定新的DatModel数据模型makeVisible(data)该函数触发组件滚动到确保data对象出现在可见区域。invalidateModel()该函数触发组件重新排序过滤加载数据,一般组件会自动调用,除非数据变化但未派发事件时才需强制调用redraw()重绘刷新,注意该函数不会触发数据模型的重新加载invalidateData(data)调用该函数会重绘data对象所在行drawRow(g, data, selected, x, y, width, height)绘制行内容,可重载自定义drawRowBackground(g, data, selected, x, y, width, height)绘制行背景色,默认仅在选中该行时填充选中背景色,可重载自定义drawLabel(g, data, x, y, height)绘制文本,可重载自定义,label一般绘制在最后因此没有width参数限制drawIcon(g, data, x, y, width, height)绘制图标,可重载自定义,这里width值取值于getIconWidth函数getIconWidth(data)返回data对象对应的图标宽度,默认如果有图标则以indent值为宽度,可重载自定义getIndent()和setIndent(20)获取和设置indent缩进,该参数一般用于指定图标的宽度handleDragAndDrop(event, state)该函数默认为空,若该函数被重载,则pan平移组件功能将被关闭event鼠标或Touch交互事件state当前状态,先后会有prepare-begin-between-end四种过程以下代码重载了drawRowBackground函数,绘制了列表行交替斑马线的效果:
listView.drawRowBackground = function(g, data, selected, x, y, width, height){
if(this.isSelected(data)){
g.fillStyle = '#87A6CB';
}
else if(this.getRowIndex(data) % 2 === 0){
g.fillStyle = '#F1F4F7';
}
else{
g.fillStyle = '#FAFAFA';
}
g.beginPath();
g.rect(x, y, width, height);
g.fill();
};
自定义了productIcon矢量图标,该图标设置了clip函数将图片裁剪成圆形效果,设置了listView.setIndent(60)为图片留出缩进间距,
重载了listView.getIcon函数,所有data都返回productIcon的矢量图标:
ht.Default.setImage('productIcon', {
width: 50,
height: 50,
clip: function(g, width, height) {
g.beginPath();
g.arc(width/2, height/2, Math.min(width, height)/2-3, 0, Math.PI * 2, true);
g.clip();
},
comps: [
{
type: 'image',
stretch: 'uniform',
rect: [0, 0, 50, 50],
name: {func: function(data){return 'images/' + data.a('ProductId') + '.jpg';}}
}
]
});
listView.setIndent(60);
listView.getIcon = function(data){
return 'productIcon';
};
自定义了getLabel根据attr定义的属性组合成label信息,自定义了getToolTip函数,以html格式返回文本提示信息:
listView.enableToolTip();
listView.getLabel = function(data){
return data.a('ProductName') + ' - $' + data.a('UnitPrice').toFixed(2);
};
listView.getToolTip = function(e){
var data = this.getDataAt(e);
if(data){
return '<span style="color:#3D97D0">ProductId: </span>' + data.a('ProductId') + '<br>' +
'<span style="color:#3D97D0">ProductName: </span>' + data.a('ProductName') + '<br>' +
'<span style="color:#3D97D0">QuantityPerUnit: </span>' + data.a('QuantityPerUnit') + '<br>' +
'<span style="color:#3D97D0">Description: </span>' + data.a('Description');
}
return null;
};
通过listView.setSortFunc设置了排序函数,根据attr上的UnitPrice价格属性进行对比:
sortFunc = function(d1, d2){
return d1.a('UnitPrice') - d2.a('UnitPrice');
};
listView.setSortFunc(sortFunc);
toolbar.setItems([
{
label: 'Sort by price',
type: 'toggle',
selected: true,
action: function(){
listView.setSortFunc(this.selected ? sortFunc : null);
}
}
]);
通过listView.setVisibleFunc设置了行过滤器,根据toolbar上的文本输入框内容进行过滤:
toolbar.setItems([
{
id: 'text',
label: 'Search',
icon: 'images/search.png',
textField: {
width: 120
}
}
]);
toolbar.getItemById('text').element.getElement().onkeyup = function(e){
listView.invalidateModel();
};
listView.setVisibleFunc(function(data){
var text = toolbar.v('text');
if(text){
return data.a('ProductName').toLowerCase().indexOf(text.toLowerCase()) >= 0;
}
return true;
});