开发实战
开发简单的crud应用
我们来使用knockout开发一个具备增删改功能的列表,首先确保如下文件的引入
<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>
添加首页id后增加导航栏,然后绑定事件
<div class="um-header">
<a href="#" class="ti-pencil-alt f18 um-header-left" id="edite_list" data-bind="click: edite"></a>
<h3>标题</h3>
<a class="um-header-right ti-plus" href="#edite" data-bind="click: addlist" data-transition="pop"></a>
</div>
在内容区新增列表行模板
<ul class="um-list" id="shopContent" data-bind="foreach: listData">
<li class="list-item">
<a href="#edite" class="um-list-item">
<div class="um-list-item-media">
<label class="um-check-inline um-list-left-icon">
<input name="um-checkbox-inline" type="checkbox">
<span class="um-icon-checkbox um-css3-vc"></span>
</label>
<img height=40 width=40 data-bind="attr:{src:imgsrc}" alt="...">
</div>
<div class="um-list-item-inner" data-bind="click: $parent.lineClick">
<div class="um-list-item-body">
<h4 class="um-media-heading" data-bind="text: title"></h4>
<p data-bind="text: content"></p>
<p data-bind='visible: $parent.tipsVisible() > 0.5, text: tips' class="um-red"></p>
</div>
<div class="um-list-item-right">
<div class="mr15" data-bind="text: status"></div>
<span class="f12 mr15" data-bind="text: time"></span>
</div>
</div>
</a>
</li>
</ul>
该列表设置了a标签指向id为edite的页面,后面我们再增加edite页面
在内容区外(或者um-footer里)增加2个编辑操作的按钮
<div class="none" id="check">
<div class="um-box-justify p10">
<a href="#" data-bind="click: checkAll">全选</a>
<a href="#" data-bind="click: remove">删除</a>
</div>
</div>
新增edite页面
<div class="um-page" id="edite">
<div class="um-header" >
<a href="#" class="um-back"> 返回</a>
<h3>导航栏</h3>
<a class="um-header-right ti-save" href="#" data-bind="click: save"></a>
</div>
<div class="um-content">
<ul class="um-list" data-bind="with: line">
<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" data-bind="value: title">
</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" data-bind="value: content">
</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 name="" class="form-control" data-bind="value: status">
<option value="审阅中">审阅中</option>
<option value="已批准">已批准</option>
<option value="未提交">未提交</option>
</select>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
生成带有多个字段的多条数据
var shopData = {
data : []
};
for (var i = 0; i < 35; i++) {
var j = {};
j.title = "ZJT股份有限公司" + i;
j.content = ["生产","加工","销售","包装","采购"][parseInt(Math.random() * 5)];
j.time = "星期" + ["一","二","三","四","五","六","七"][parseInt(Math.random() * 7)];
j.status = ["审阅中","已批准","未提交"][i%3];
j.imgsrc = "img/portal.jpg";
j.tips = "提示" + i;
shopData.data.push(j);
}
绑定模型
function shopModal(){
var self = this;
// 设置默认值
self.defaults = {
activeIndex: 0,
isAdd: false,
isAllcheck: false,
isCancle: true,
initData: {
title: "",
content: "",
status: "",
time: "星期一",
imgsrc: "img/s5.png",
tips: ""
}
}
// 将数据数组绑定到模型的listData上,通过foreach可以遍历并渲染出来
self.listData = ko.observableArray(shopData.data);
// 绑定edite页面的输入框的数据为初始值
self.line = ko.observable(self.defaults.initData);
// 设置tips字段为随机显示
self.tipsVisible = function() {
return Math.random();
}
// 定义行点击事件监听
self.lineClick = function(data, e) {
var lineData = $.extend({},self.defaults.initData,data);
self.line(lineData);
var index = $(e.target).closest("li").index();
self.defaults.activeIndex = index;
self.defaults.isAdd = false;
}
// 增加列表数据
self.addlist = function () {
initData = {
title: "",
content: "",
status: "",
time: "星期一",
imgsrc: "img/s5.png",
tips: ""
}
self.line(initData);
self.defaults.activeIndex = 0;//self.listData().length;
self.defaults.isAdd = true;
}
// 保存列表数据
self.save = function() {
var newLine = new self.line();
if(!newLine.title || !newLine.content) {
UM.modal("alert","亲,输入数据后才能保存哦!");
return;
}
if(self.defaults.isAdd) {
self.listData.splice(self.defaults.activeIndex, 0, newLine);
} else {
self.listData.splice(self.defaults.activeIndex, 1, newLine);
}
UM.page.back();
}
// 全选
self.checkAll = function(){
self.defaults.isAllcheck = !self.defaults.isAllcheck;
$("#shopContent").find("input:checkbox").prop("checked", self.defaultsisAllcheck);
}
// 编辑列表
self.edite = function(modal, e) {
var target = $(e.target);
if(self.defaults.isCancle) {
openCheck();
target.removeClass("ti-pencil-alt").html("取消");
} else {
closeCheck();
target.html("").addClass("ti-pencil-alt");
}
self.defaults.isCancle = !self.defaults.isCancle;
}
self.remove = function() {
$.each($("#shopContent").find("input:checkbox:checked"),function(){
var checkItem = $(this).closest(".list-item");
var i = checkItem.index()
checkItem.slideUp(400, function(){
closeCheck();
var index = checkItem.index();
checkItem.remove();
});
});
$("#edite_list").trigger("click");
}
}
// 绑定模型
ko.applyBindings(new shopModal());
// 打开底部编辑工具栏和列表选择框
function openCheck() {
$("#shopContent").find(".um-list-item").addClass("um-list-left-open");
$("#index #check").removeClass("none");
}
// 关闭底部编辑工具栏和列表选择框
function closeCheck() {
$("#shopContent").find(".um-list-item").removeClass("um-list-left-open");
$("#index #check").addClass("none");
}
最终效果如下
文档更新时间: 2018-01-12 16:32