BootstrapTable+KnockoutJS相结合实现增删改查解决方案三两个Viewmodel搞定增删改查

前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来。最近项目打算正式将ko用起来,于是乎对ko和bootstraptable做了一些封装,在此分享出来供园友们参考。封装思路参考博客园大神萧秦,如果园友们有更好的方法,欢迎讨论。

KnockoutJS系列文章

一、第一个viewmodel搞定查询

demo的实现还是延续上次的部门管理功能。以下展开通过数据流向来说明。

1、后台向View返回viewmodel的实现

rush:js;"> public ActionResult Index() { var model = new { tableParams = new { url = "/Department/GetDepartment",//pageSize = 2,},urls = new { delete = "/Department/Delete",edit = "/Department/Edit",add = "/Department/Edit",queryCondition = new { name = "",des = "" } }; return View(model); }

代码释疑:这里返回的model包含三个选项

•tableParams:页面表格初始化参数。由于js里面定义了认参数,所以这里设置的参数是页面特定的初始化参数。

•urls:包含增删改请求的url路径。

•queryCondition:页面查询条件。

2、cshtml页面代码

Index.cshtml页面代码如下:

rush:js;"> @{ Layout = null; } Index
heading">查询条件
名称
Box="true">
名称

代码释疑:和上篇一样,需要引用JQuery、bootstrap、bootstraptable、knockout等相关文件。这里重点说明下两个文件

•knockout.index.js:封装了查询页面相关的属性和事件绑定。

•knockout.bootstraptable.js:封装了bootstrapTable的初始化和自定义knockout绑定的方法

以上所有的页面交互都封装在了公共js里面,这样就不用在页面上面写大量的DOM元素取赋值、事件的绑定等重复代码,需要在本页面写的js只有以上两句,是不是很easy。

3、JS封装

重点来看看上面的说的两个js文件knockout.bootstraptable.js和knockout.index.js。

(1)knockout.bootstraptable.js

rush:js;"> (function ($) { //向ko里面新增一个bootstrapTableviewmodel方法 ko.bootstrapTableviewmodel = function (options) { var that = this; this.default = { toolbar: '#toolbar',//工具按钮用哪个容器 queryParams: function (param) { return { limit: param.limit,offset: param.offset }; },//传递参数(*) pagination: true,//是否显示分页(*) sidePagination: "server",//分页方式:client客户端分页,server服务端分页(*) pageNumber: 1,//初始化加载第一页,认第一页 pageSize: 10,//每页的记录行数(*) Pagelist: [10,25,50,100],//可供选择的每页的行数(*) method: 'get',search: true,//是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大 strictSearch: true,showColumns: true,//是否显示所有的列 cache:false,showRefresh: true,//是否显示刷新按钮 minimumCountColumns: 2,//最少允许的列数 clickToSelect: true,//是否启用点击选中行 showToggle: true,}; this.params = $.extend({},this.default,options || {}); //得到选中的记录 this.getSelections = function () { var arrRes = that.bootstrapTable("getSelections") return arrRes; }; //刷新 this.refresh = function () { that.bootstrapTable("refresh"); }; }; //添加ko自定义绑定 ko.bindingHandlers.bootstrapTable = { init: function (element,valueAccessor,allBindingsAccessor,viewmodel) { //这里的oParam就是绑定的viewmodel var oviewmodel = valueAccessor(); var $ele = $(element).bootstrapTable(oviewmodel.params); //给viewmodel添加bootstrapTable方法 oviewmodel.bootstrapTable = function () { return $ele.bootstrapTable.apply($ele,arguments); } },update: function (element,viewmodel) { } }; })(jQuery);

代码释疑:上面代码要做了两件事

1.自定义了bootstrapTable初始化的viewmodel。

2.

添加ko自定义绑定。

如果园友不理解自定义绑定的使用,可以看看博主的前两篇博文(一)和(二),有详细介绍。

(2)knockout.index.js

rush:js;"> (function ($) { ko.bindingviewmodel = function (data,bindElement) { var self = this; this.queryCondition = ko.mapping.fromJS(data.queryCondition); this.defaultQueryParams = { queryParams: function (param) { var params = self.queryCondition; params.limit = param.limit; params.offset = param.offset; return params; } }; var tableParams = $.extend({},this.defaultQueryParams,data.tableParams || {}); this.bootstrapTable = new ko.bootstrapTableviewmodel(tableParams); //清空事件 this.clearClick = function () { $.each(self.queryCondition,function (key,value) { //只有监控属性才清空 if (typeof (value) == "function") { this(''); //value(''); } }); self.bootstrapTable.refresh(); }; //查询事件 this.queryClick = function () { self.bootstrapTable.refresh(); }; //新增事件 this.addClick = function () { var dialog = $('

代码释疑:由于我们加了验证组件bootstrapValidator,所以需要引用相关js和css。knockout.edit.js这个文件主要封装了编辑页面属性和事件绑定。重点来看看这个js的实现代码

3、js封装

knockout.edit.js代码

rush:js;"> (function ($) { ko.bindingEditviewmodel = function (data,validatorFields) { var that = {}; that.editModel = ko.mapping.fromJS(data.editModel); that.default = { message: '验证不通过',fields: { },submitHandler: function (validator,form,submitButton) { var arrselectedData = ko.toJS(that.editModel); $.ajax({ url: data.urls.submit,status) { alert(status); } }); $("#myModal").modal("hide"); } }; that.params = $.extend({},that.default,{fields: validatorFields} || {}); $('#formEdit').bootstrapValidator(that.params); ko.applyBindings(that,document.getElementById("formEdit")); }; })(jQuery);

代码释疑:这个js主要封装了编辑模型的属性和提交的事件绑定。由于用到了bootstrapValidator验证组件,所以需要表单提交。其实公共js里面是不应该出现页面id的,比如上面的“formEdit”和“myModal”,可以将此作为参数传过来,这点有待优化。参数validatorFields表示验证组件的验证字段,如果表单不需要验证,则传一个空的Json或者不传都行。上文我们没有做字段验证,其实一般来说,基础表都会有一个或者几个非空字段,比如我们可以加上部门名称的非空验证。在Edit.cshtml页面代码改成这样:

rush:js;">

那么就会在提交的时候自动进行验证:

注意:验证属性Name对应的是input标签的name属性,所以要做验证,这个name属性必须设置正确。

最好附上增删改的后台方法

rush:js;"> [HttpPost] public JsonResult Add(Department oData) { DepartmentModel.Add(oData); return Json(new { },JsonRequestBehavior.AllowGet); } [HttpPost] public JsonResult Update(Department oData) { DepartmentModel.Update(oData); return Json(new { },JsonRequestBehavior.AllowGet); } [HttpPost] public JsonResult Delete(List oData) { DepartmentModel.Delete(oData); return Json(new { },JsonRequestBehavior.AllowGet); }

至此,我们整个页面的增删改查效果就OK了,简单看下效果

三、总结

以上简单封装了bootstrapTable+ko的增删改查业务,只是一个最初级的封装。如果你需要将这些运用都你的项目中,可能还需要一些简单的优化措施,比如:

1、如果单纯是一个页面viewmodel,是否可以不用从后台的ActionResult里面返回,直接写在View页面里面感觉更好,省去了序列化和参数传递的问题。这点有待优化。

2、公共js里面不应该出现页面元素的id,可以通过参数将页面元素传递进来。

3、新增和编辑事件方法里面弹出框的部分有很多重复代码,这部分的最好做法是将弹出框封装成一个单独的组件去调用,可以减少大部分的js代码

4、如果查询条件以及编辑的属性里面存在select下拉框元素,可能还需要封装下拉框的datasourse等属性,这一部分是非常常见的,等博主整理好demo后将这块加进去。

以上所述是小编给大家介绍的BootstrapTable+KnockoutJS相结合实现增删改查解决方案(三)两个viewmodel搞定增删改查 。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可分享给好友!感谢支持

相关文章

Bootstrip HTML 查询搜索常用格式模版 <form class=&...
如何在按钮上加红色数字 您可以使用Bootstrap的badge组件来在...
要让两个按钮左右排列,你可以使用 Bootstrap 的网格系统将它...
是的,可以将status设置为布尔类型,这样可以在前端使用复选...
前端工程师一般用的是Bootstrap的框架而不是样式,样式一般自...
起步导入:<linkrel="stylesheet"href="b...