开发实战
开发简单的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