视频地址:http://pan.baidu.com/s/1gdzk4gz
list组件,动态数据显示组件。
目录
一、综述
二、DOM结构
三、样式
四、属性
五、方法
六、事件
七、操作
八、案例
一. 综述
list组件对获取动态数据进行封装,通过配合的样式,使开发者能快速完成数据列表展示功能的开发。list组件根据关联的data和模板进行数据渲染展示,通过limit属性可以控制页加载数据条数,当limit=-1时感知data的limit,即data加载多少数据就显示多少数据,filter属性可以控制需要展现的数据,例如只显示年龄大于20的可以设置为$row.val(‘fAge’)>20,list组件和scrollview组件配合可以实现上滑加载数据,下滑刷新数据的能力(这是手机应用中常用的特性)。
组件路径:/UI2/system/components/justep/list
组件标识:$UI/system/components/justep/list/list
注:模板,组件上标识有class=”x-list-template”的第一个节点为模板,其所以子节点根据数据进行循环
配合其它组件使用,可实现以下功能:
- 图文混排列表
- 文字列表
- 图片墙
- 动态表格
- 动态表单
图文混排列表-新闻列表
文字列表
图片墙
动态表格
动态表单
二. DOM结构
- 典型dom结构1
<div component="$UI/system/components/justep/list/list"
class="x-list" xid="xxxList" data="xxxData" limit="5">
<!-- x-list-template表示list循环的模版,该节点的子节点会被循环 -->
<ul class="x-list-template list-group">
<li class="list-group-item">
<!-- 任意行内容 -->
</li>
</ul>
</div>
- 典型dom结构2(列表行循环)
<ul component="$UI/system/components/justep/list/list"
class="x-list x-list-template list-group"
xid="xxxList" data="xxxData" limit="5">
<li class="list-group-item">
<!-- 任意行内容 -->
</li>
</ul>
- 典型dom结构3(表格行循环)
<table component="$UI/system/components/justep/list/list"
class="x-list" xid="xxxList" data="xxxData" limit="5">
<thead>
<tr><th><!--列头--></th>...</tr>
</thead>
<tbody class="x-list-template">
<tr><td><!-- 任意行内容 --></td>...</tr>
</tbody>
</table>
- 典型dom结构4(表格列循环)
<table>
<thead component="$UI/system/components/justep/list/list"
class="x-list" xid="xxxList1" data="xxxData" limit="-1">
<tr class="x-list-template">
<th><!--列头--></th>
</tr>
</thead>
<tbody component="$UI/system/components/justep/list/list"
class="x-list" xid="xxxList2" data="xxxData" limit="-1">
<tr class="x-list-template">
<td><!-- 任意列内容 --></td>
</tr>
</tbody>
</table>
三. 样式
- x-list
组件标识class,没有样式定义
- x-list-template
模板标识class,组件上包含有class=”x-list-template”的第一个节点为模板节点,其所以子节点根据数据进行循环
- x-cards
卡片式风格
四. 属性
- data
- limit
[integer] 一页显示数据条数,当Data加载的数据少于limit指定的条数,list组件会自动触发Data组件向服务端拉取数据直到等于指定limit条数或者Data数据已经完全加载,为-1时感知data的limit属性,即data有多少数据显示多少数据,默认:-1;注:当data属性指向Data组件时有效
- filter
[string] 过滤条件表达式,表达式中可以使用$model,$object,$parent,$row(执行过滤的数据行对象)变量,例如:只显示年龄大于20的可以设置为$row.val(‘fAge’)>20;当list组件嵌套时,可以使用$parent获取外层list行上的数据,例如:显示和主关联的子数据可以设置为$row.val(‘fParent’)==$parent.val(‘fID’);当然还可以直接在model上自定义实现function实现过滤,例如:同样实现只显示年龄大于20的可以设置为$model.age20($row)
model代码:
Model.prototype.age20 = function(row){
return row.val('fAge')>20;
};
注:当通过js代码动态修改filter属性后需要显示调用refresh()进行刷新
- autoLoad
[boolean] [readonly] 自动加载list数据,当autoLoad==true并且data属性绑定的是Data组件时list会主动调用Data组件refreshData方法加载数据,当autoLoad==false时需要显示调用refresh方法才行显示list数据,默认为true。
- disablePullTorefrefresh
[boolean] 禁止下滑刷新,默认为false,注:需配合scrollview组件使用
- disableInfiniteLoad
[boolean] 禁止上滑加载数据,默认为false,注:需配合scrollview组件使用
- xid
[string] [readonly] 组件id
五. 方法
- 构造函数
new List(cfg) 代码动态创建List组件
参数 cfg [object] 构造List的初始参数,包括:data、filter、autoLoad等List属性和特殊属性template,list模板部分的字符串;
例:
//动态新建list组件加入xid=view的节点下
var cfg = {
xid: 'list1',
autoLoad: true,
data: 'newsData',
template: '<div class="x-list-template"><div data-bind="{text:ref(\'fTitle\')}"></div></div>',
parentNode: this.getElementByXid('view')
};
new List(cfg);
- get
object get() 获取组件相关属性,参考:组件属性
例:
//获取设置的autoLoad属性
this.comp(“list1”).get("autoLoad");
- set
void set(name, val) 设置组件的非只读属性,参考:组件属性
例:
//代码设置filter后需要主动调用list.refresh()
var list = this.comp(“list1”);
list.set('filter','fAge<20');
list.refresh();
- getData
Data getData() 获取绑定的Data组件,当data属性绑定Data组件时返回Data组件,否则返回null
例:
this.comp(“list1”).getData();
- refresh
void refresh(boolean refreshData) 刷新list,当autoLoad==false时,需要开发者显示调用refresh方法刺激list显示
boolean refreshData 是否刷新data
例:
this.comp(“list1”).refresh(true);
- loadNextPage
void loadNextPage() 加载下页数据,受limit属性影响
例:
this.comp(“list1”).loadNextPage();
- getBindingObjects
Data.Row[]|object[] getBindingObjects() list组件绑定的数据行数组或者对象数字(和data属性设置有关)
例:
//如果data指定的是data对象
var rows = this.comp(“list1”).getBindingObjects();
if(rows && rows.length>0)
$.each(rows,function(i,row){
row.val('fAge');
......
});
六. 事件
void onAfterRender(object event) 每条数据加载前触发的事件
event结构如下:
{
"source" : 组件的js对象,
"bindingContext" : 组件绑定的上下文,
包含$model、$object等具体请参考bindingContext说明
}
例:
Model.prototype.list1AfterRender = function(event){
alert(“list渲染完成,共渲染:”+event.source.getBindingObjects().length+'条数据');
};
七. 操作
- (无)
八. 案例
1、图文混排列表–新闻列表
- 在scrollview组件中增加list组件。
- 在list组件上绑定对应data组件,limit属性设置每页显示条数实现分页显示。
- list组件的li里显示数据,使用Bootstrap media样式排版。
- 增加新闻图片大小样式
.x-news-image { width: 64px; height: 64px; }
代码示例:
<ul component="$UI/system/components/justep/list/list"
xid="newsList" class="x-list x-list-template"
data="newsData" limit="8">
<li class="media">
<div class="pull-left media-object">
<img class="img-rounded x-news-image"
bind-attr-src="$model.getImageUrl($object)"/>
</div>
<div class="media-body">
<h4 class="media-heading" bind-text="ref('fTitle')"/>
<div bind-text="ref('fContent')"/>
</div>
</li>
</ul>
2、文字列表(data属性为function)
- 增加list组件。
- model上增加函数getTexts,返回数组,用于绑定list组件data属性
Model.prototype.getTexts = function(){ var data = this.comp('newsData'); var ret = []; data.each(function(param){ var row = param.row; var fTitle = row.val('fTitle')||''; //不显示fTitle中包含2的数据 if(fTitle.indexOf('2')<0) ret.push(row); }); return ret; }; - 在list组件上设置data=getTexts。
- list组件的li里显示数据,放入span和i进行内容显示,使用Bootstrap list-group样式排版。
代码示例:
<ul component="$UI/system/components/justep/list/list"
class="x-list list-group x-list-template"
xid="textList" data="getTexts">
<li class="list-group-item">
<span bind-text="ref('fTitle')"/>
<i class="pull-right icon-chevron-right"/>
</li>
</ul>
3、图片墙
- 增加list组件。
- 在list组件上绑定对应data组件。
- list组件的li里显示数据,使用Bootstrap list-group、thumbnail样式排版
代码示例:
<div component="$UI/system/components/justep/list/list"
xid="orgList" class="x-list" data="newsData" limit="8">
<!-- 使用row布局,手机显示2列,pad显示3列-->
<div class="x-list-template row">
<div class="col-xs-6 col-sm-4">
<div class="thumbnail">
<img class="img-rounded"
bind-attr-src="$model.getImageUrl($object)"/>
<div class="caption">
<span bind-text="ref('fTitle')"/>
</div>
</div>
</div>
</div>
</div>
4、动态表格
- 增加list组件。
- 在list组件上绑定对应data组件。
- 删除list下的模板
- 在list组件下插入table组件对表格进行排版。
代码示例:
<div component="$UI/system/components/justep/list/list"
class="x-list" data="newsData" xid="list2">
<!-- 使用Bootstrap样式定义表格 -->
<table component="$UI/system/components/bootstrap/table/table"
class="table table-bordered table-hover table-striped">
<thead xid="thead2">
<tr xid="tr3">
<th xid="col1">#</th>
<th xid="col2" bind-text="newsData.label('fTitle')"></th>
<th xid="col3" bind-text="newsData.label('fContent')"></th>
</tr>
</thead>
<tbody class="x-list-template" xid="listTemplate2">
<tr xid="tr4">
<td xid="td2" bind-text="$index()+1">1</td>
<td xid="td3" bind-text="ref('fTitle')"/>
<td xid="td4" bind-text="ref('fContent')"/>
</tr>
</tbody>
</table>
</div>
5、表单-购物车
- 增加list组件。
- 在list组件上绑定对应data组件。
- list组件的li里插入row组件对表格进行排版,row里加数据感应组件。
代码示例:
<div component="$UI/system/components/justep/list/list"
class="x-list" xid="carList" data="cartData">
<ul class="x-list-template" xid="listTemplateUl2">
<li xid="li2">
<!-- 使用row进行布局 -->
<div component="$UI/system/components/bootstrap/row/row"
class="row" xid="row1">
<div class="col col-xs-5" xid="col7">
<div component="$UI/system/components/justep/output/output"
class="x-output" xid="output4"
bind-ref="ref('fName')" style="font-weight:bold;"/>
</div>
<div class="col col-xs-2" xid="col8">
<div component="$UI/system/components/justep/output/output"
class="x-output" xid="output11" bind-ref="ref('fPrice')"/>
</div>
<div class="col col-xs-5" xid="col9">
<a component="$UI/system/components/justep/button/button"
class="btn btn-xs btn-only-icon" label="button" xid="reduceCountBtn"
icon="icon-android-remove" onClick="reduceCountBtnClick"
style="color:white;background-color:#35b3e4;">
<i xid="i3" class="icon-android-remove"/>
<span xid="span3"/>
</a>
<div component="$UI/system/components/justep/output/output"
class="x-output" xid="output5" bind-ref="ref('fCount')"
style="text-align:center;margin-right:10px;margin-left:10px;display:inline-block"/>
<a component="$UI/system/components/justep/button/button"
class="btn btn-xs btn-only-icon" label="button" xid="addCountBtn"
icon="icon-android-add" onClick="addCountBtnClick" style="color:white;background-color:#35b3e4;">
<i xid="i4" class="icon-android-add"/>
<span xid="span4"/>
</a>
</div>
</div>
</li>
</ul>
</div>
源代码请参考版本中模型相关:
新闻列表、文字列表、图片墙、动态表格—/UI2/system/components/justep/list/demo/list.w
表单-购物车—/UI2/takeout-pre/index.w
本文由WeX5君整理,WeX5一款开源免费的html5开发工具,H5 App开发就用WeX5!
阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443





老有用了。
我在同一个w文件下panel->contents->content1|content2 ->scrollView1|scrollView2 -> list1|list2 公用一个newsData 。发现会提示function(t){return t&&t.ref? t.ref(e): “”}
貌似两个content不能同时公用一个data数据,会有叠影。
onClick 事件中 如何得到 list某一行的id?
scrollView如何设置横向滚动,这里没有例子,自己尝试了,都无法设置出横向滚动的功能。