索引
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)
获取和设置行线是否可见,默认为true
getRowLineColor()
和setRowLineColor(color)
获取和设置行线颜色getSortFunc()
和setSortFunc(sortFunc)
获取和设置排序函数getVisibleFunc()
和setVisibleFunc()
获取和设置可见过滤器,其可过滤DataModel
中的Data
数据对象getScrollBarColor()
和setScrollBarColor(color)
获取和设置滚动条颜色getScrollBarSize()
和setScrollBarSize(6)
获取和设置滚动条宽度isAutoHideScrollBar()
和setAutoHideScrollBar(true/false)
获取和设置是否自动隐藏滚动条,默认为true
isCheckModel()
和setCheckMode(true/false)
获取和设置是否为check
模式,默认为false
getCheckIcon(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;
});