目录
列表开发实例
1. 功能说明
本文档我们将采用listview列表控件开发一个包含上下拉、滑动删除、新增和修改功能的CURD应用。
在开发之前,请确保项目中引入以下文件:
<link rel="stylesheet" href="css/iuapmobile.um-2.7.0.css">
<link rel="stylesheet" href="css/themify-icons/themify-icons.css">
<script src="js/jquery-2.1.4.min.js"></script>
<script src="js/knockout-2.2.0.js"></script>
<script src="js/Frameworks/iuapmobile.frameworks.ui-2.7.0.js"></script>
<script src="js/Frameworks/ iuapmobile.frameworks.listview-2.7.0.js"></script>
2.实现
2.1 首页添加动态列表
添加首页id后增加导航栏,并添加新增按钮,设置新增按钮id属性为“add”,后面会用到。
<div class="um-header">
<h3>订单列表</h3>
<a href="#" id="add" class="ti-plus um-header-right f18"></a>
</div>
在内容区插入listview模板,结构如下,
<div class="um-listview-wrap" id="listview">
<ul class="um-list um-no-active" data-bind="foreach:data">
<li class="um-listview-row">
<a href="#" class="um-list-item um-swipe-action um-no-icon">
<div class="um-swipe-btns">
<span class="um-swipe-btn um-delete">删除</span>
</div>
<div class="um-list-item-inner">
<div class="um-list-item-body" style="padding-right:0">
<div class="clearfix">
<div class="um-xs-6 tl um-text-overflow">
<span class="fb" data-bind="text:company"></span>
</div>
<div class="um-xs-6 tr um-text-overflow um-red f20">
<span data-bind="text:currency"></span>
<span data-bind="text:order_money"></span>
</div>
</div>
<div class="clearfix mt5 f14">
<div class="um-xs-6 tl um-text-overflow">
<span data-bind="text:order_id" class="um-gray"></span>
<span data-bind="text:order_status"></span>
</div>
<div class="um-xs-6 tr um-text-overflow">
<span data-bind="text:order_date" class="um-gray"></span>
</div>
</div>
</div>
</div>
</a>
</li>
</ul>
</div>
与此同时,我们会在文档尾部插入一段初始化控件的JS片段,如下所示,这段代码中我们已经实现了构造控件实例、Knockout绑定、添加控件方法。
$(function() {
//构造控件实例
var listview = UM.listview('#listview');
//Knockout绑定
var ViewModel = function(jsonArray) {
};
var jsonArray = [
{'company':'国家电网公司','order_id':'000000000001','order_status':'待审核','order_money':'1,500','currency':'$','order_date':'2015-01-01','delivery_date':'2015-01-02','contact_name':'小明','contact_tel':'130********','if_store':false, 'memo':'记得及时发货'},
{'company':'中国移动通信集团公司','order_id':'000000000002','order_status':'待确认','order_money':'11,000','currency':'$','order_date':'2015-01-01','delivery_date':'2015-01-02','contact_name':'小明','contact_tel':'130********','if_store':false, 'memo':'记得及时发货'},
{'company':'中国人寿保险(集团)公司','order_id':'000000000003','order_status':'已关闭','order_money':'22,100','currency':'$','order_date':'2015-01-01','delivery_date':'2015-01-02','contact_name':'小明','contact_tel':'130********','if_store':false, 'memo':'记得及时发货'},
{'company':'中国电信集团公司','order_id':'000000000004','order_status':'待审核','order_money':'41,100','currency':'$','order_date':'2015-01-01','delivery_date':'2015-01-02','contact_name':'小明','contact_tel':'130********','if_store':false, 'memo':'记得及时发货'},
{'company':'中国华润总公司','order_id':'000000000005','order_status':'待发货','order_money':'30,100','currency':'$','order_date':'2015-01-01','delivery_date':'2015-01-02','contact_name':'小明','contact_tel':'130********','if_store':false, 'memo':'记得及时发货'},
];
var viewModel = new ViewModel();
viewModel.data = ko.observableArray(jsonArray);
ko.applyBindings(viewModel);
//控件方法及其他代码此处先省略,上下拉刷新和侧滑删除,以及新增和修改列表的代码将在//此处书写
});
至此,我们的列表已经初始化,并且已经用knockout给列表绑定了字段,可以展示数据了,接下来,我们给列表添加上下拉刷新。
2.2 列表上下拉加载数据
承接上节,我们在列表使用Knockout动态绑定数据后,添加以下控件方法,即可实现上下拉加载数据。
listview.on('pullDown', function(sender) {
//这是可以编写列表下拉加载逻辑,参数sender即为当前列表实例对象
var row = {
'company' : '中国兵器装备集团公司',
'order_id' : '000000000000',
'order_status' : '待审核',
'order_money' : '1,500',
'currency' : '$',
'order_date' : '2015-01-01',
'delivery_date' : '2015-01-02',
'contact_name' : '小明',
'contact_tel' : '130********',
'if_store' : false,
'memo' : '记得及时发货'
};
viewModel.data.unshift(row);
sender.refresh();
});
listview.on('pullUp', function(sender) {
//这是可以编写列表上拉刷新逻辑,参数sender即为当前列表实例对象
var row = {
'company' : '宝钢集团有限公司',
'order_id' : '000000000006',
'order_status' : '待审核',
'order_money' : '2,500',
'currency' : '$',
'order_date' : '2015-01-01',
'delivery_date' : '2015-01-02',
'contact_name' : '小明',
'contact_tel' : '130********',
'if_store' : false,
'memo' : '记得及时发货'
};
viewModel.data.push(row);
sender.refresh();
});
*注:上面的绿色标注代码为示例代码,可根据需要自己书写
2.3 列表侧滑删除
承接上节,我们在列表支持上下拉加载数据后,添加以下控件方法,即可实现上下拉刷新。
listview.on('itemSwipeLeft', function(sender, args) {
//这里可以处理行左滑事件,参数sender即为当前列表实例对象,args对象有2个属性,即//rowIndex(行索引)和$target(目标行的jquery对象)
sender.showItemMenu(args.$target);
});
listview.on('itemDelete', function(sender, args) {
//这是可以编写行删除逻辑,参数sender即为当前列表实例对象,args对象有2个属性,即//rowIndex(行索引)和$target(目标行的jquery对象)
args.$target.slideUp(500, function() {
var item = viewModel.data()[args.rowIndex];
viewModel.data.remove(item);
});
});
*注:上面的绿色标注代码为示例代码,可根据需要自己书写
2.4 列表新增和修改条目
本节我们将在之前列表上拉刷新和侧滑删除功能基础上,实现列表新增和修改功能。
由于列表新增和修改功能使用的dom结构类似,我们这里复用同样的DOM结构,只是逻辑稍微有点不同,具体操作如下:
在之前的dom结构基础上,我们在首页的um-page容器后面新建一个空的um-page容器,设置其id属性为”orderRow”,添加导航控件,并添加返回和保存按钮。如下所示,设置保存按钮id属性为”save”:
<div class="um-page" id="orderRow">
<div class="um-header">
<a href="#" class="um-back"> 返回</a>
<h3>订单</h3>
<a id="save" href="#" class="um-header-right">保存</a>
</div>
<div class="um-content">
<!-- 内容区 -->
</div>
<div class="um-footer"></div>
</div>
与此同时,我们在原有代码
viewModel.data = ko.observableArray(jsonArray);
这句代码后面,给数据模型绑定一个rowData字段(后面会用到),用以编辑和修改行数据,如下所示:
viewModel.rowData = ko.observable({
'company' : '',
'order_id' : '',
'order_status' : '待审核',
'order_money' : '',
'currency' : '$',
'order_date' : '',
'delivery_date' : '',
'contact_name' : '',
'contact_tel' : '',
'if_store' : false,
'memo' : ''
})
在内容区插入uapmobile已有的表单控件,结构如下,并依照之前列表数据结构给表单元素添加绑定字段,如下所示:
<ul class="um-list" data-bind="with:rowData">
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<span class="h pa um-box-vc um-red f20" style="margin-left:-10px;">*</span>
<div class="um-list-item-left">
公司名称
</div>
<div class="um-list-item-right">
<input type="text" class="form-control" placeholder="请输入公司名称" data-bind="value:company">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
订单编号
</div>
<div class="um-list-item-right">
<input type="text" class="form-control" placeholder="请输入订单编号" data-bind="value:order_id">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
订单状态
</div>
<div class="um-list-item-right">
<select class="form-control" data-bind="value:order_status">
<option value="待审核">待审核</option>
<option value="待发货">待发货</option>
<option value="待收货">待收货</option>
<option value="已交易">已交易</option>
<option value="已关闭">已关闭</option>
</select>
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
订单金额
</div>
<div class="um-list-item-right">
<input type="text" class="form-control" placeholder="请输入订单金额" data-bind="value:order_money">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
支付币别
</div>
<div class="um-list-item-right">
<select class="form-control" data-bind="value: currency">
<option value="¥">人民币</option>
<option value="$">美元</option>
</select>
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
下单日期
</div>
<div class="um-list-item-right">
<input type="date" name="date" value="2015-01-01" class="form-control" data-bind="value:order_date">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<span class="h pa um-box-vc um-red f20" style="margin-left:-10px;">*</span>
<div class="um-list-item-left">
预交货日期
</div>
<div class="um-list-item-right">
<input type="date" name="date" value="2015-01-02" class="form-control" data-bind="value:delivery_date">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<span class="h pa um-box-vc um-red f20" style="margin-left:-10px;">*</span>
<div class="um-list-item-left">
业务员
</div>
<div class="um-list-item-right">
<input type="text" class="form-control" placeholder="请输入业务员名字" data-bind="value:contact_name">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
联系电话
</div>
<div class="um-list-item-right">
<input type="text" class="form-control" placeholder="请输入业务员联系电话" data-bind="value:contact_tel">
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
是否收藏订单
</div>
<div class="um-list-item-right">
<label class="um-switch1">
<input type="checkbox" value="on" data-bind="checked:if_store">
<div class="um-track">
<div class="um-handle"></div>
</div> </label>
</div>
</div>
</div>
</li>
<li>
<div class="um-list-item">
<div class="um-list-item-inner">
<div class="um-list-item-left">
备注
</div>
<div class="um-list-item-right">
<textarea name="" id="" cols="30" rows="50" class="form-control" data-bind="value:memo"></textarea>
</div>
</div>
</div>
</li>
</ul>
接下来我们在之前列表侧滑删除代码的后面,继续书写列表新增和修改的代码逻辑:
var list_status = "";
//用于标识列表处于新增状态或者修改状态,edit代表编辑,add代表新增
var active_index = 0;
//用于存储被点击的行索引
listview.on('itemClick', function(sender, args) {
var item = viewModel.data()[args.rowIndex];
viewModel.rowData(item);
active_index = args.rowIndex;
UM.page.changePage({
target : '#orderRow',
transition : 'f7'
});
list_status = "edit";
});
$('#add').click(function() {
viewModel.rowData({
'company' : ' ',
'order_id' : '',
'order_status' : '待审核',
'order_money' : '',
'currency' : '$',
'order_date' : '',
'delivery_date' : '',
'contact_name' : '',
'contact_tel' : '',
'if_store' : false,
'memo' : ' '
});
UM.page.changePage({
target : '#orderRow',
transition : 'drop'
});
list_status = 'add';
});
$('#save').on('click', function() {
var item = JSON.parse(ko.toJSON(viewModel.rowData));
switch(list_status) {
case 'add':
viewModel.data.unshift(item);
break;
case 'edit':
viewModel.data.splice(active_index, 1, item);
}
UM.page.back();
});
3.效果图
首页
新增和修改页(同)