目标

使用ajax获取到json数据后,通过ko绑定到表格,然后通过jquery.gridgroup插件实现行合并,效果如下:

步骤

1.引入插件

    <script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/knockout-3.4.0.debug.js"></script>
<script src="~/Scripts/knockout.mapping-latest.js"></script>
<script src="~/Scripts/jquery.gridgroup.js"></script>

2.配置KO

   function JobTaskViewModel() {
var self = this;
self.JobTaskList = ko.observableArray([]);
self.RemoveJobTask = function() {
$('#job_task_table tbody tr').remove();
};
self.AfterAddJobTask = function (node, index, elem) {
//一般情况下KO的foreach afterAdd事件,每添加一行执行三次
//node.nodeType 分别是3,1,3 等于1的时候说明已经添加到dom中
if (node.nodeType == 1 && index == self.JobTaskList().length - 1) {
{
console.debug(index);
$('#job_task_table').gridgroup({ head: null, column: [0, 1],refresh:true });
}
}
};
}
var jobTaskViewModel = new JobTaskViewModel();
ko.applyBindings(jobTaskViewModel);

Table配置:

    <table width="826" id="job_task_table" class="zwgl_wrap_table zwgl_wrap_table_s">
<thead>
<tr style="background-color: rgb(247, 247, 247);">
<th width="100">名称一</th>
<th width="100">名称二</th>
<th width="60">用户</th>
<th width="60">目标</th>
<th width="60">交付</th>
<th width="60">任务</th>
</tr>
</thead>
<tbody data-bind="foreach:{data:JobTaskList, afterAdd:AfterAddJobTask}">
<tr>
<td data-bind="text: ProjectName"></td>
<td data-bind="text: JobTitle"></td>
<td data-bind="text: TaskUserName"></td>
<td data-bind="text: TargetDeliveryNum"></td>
<td data-bind="text: RealDeliveryNum"></td>
<td data-bind="text: TaskNum"></td>
</tr>
</tbody>
</table>

ajax请求:

 $.ajax({
cache: false,
url: '@Url.Action("GetJobDeliveryNumAndTaskNum")',
type: 'post',
data: obj,
success: function (obj) {
if (obj.Success) {
if (obj.Result.length > 0) {
jobTaskViewModel.JobTaskList.removeAll();
jobTaskViewModel.RemoveJobTask();
jobTaskViewModel.JobTaskList(obj.Result); } else { } }
else { }
},
error: function (a) { }
});

总结

上面这些步骤其实是走了弯路,因为gridgroup的设计是第一次执行缓存表格数据,所以后续的查询总是合并行后展示的数据是以前的。

(function ($) {
$.fn.extend({
gridgroup: function (options) {
//获取表参数
var gridConfig = this.data["tableData"];
//初始化表参数
if (!gridConfig) {

修改后

(function ($) {
$.fn.extend({
gridgroup: function (options) {
//获取表参数
var gridConfig = this.data["tableData"];
//初始化表参数
if (!gridConfig || (options.refresh||false)) {

这样就就可以在ajax返回结果后,顺序执行KO绑定和gridgroup分组了。

   success: function (ret) {
if (ret.Success) {
jobTaskViewModel.JobTaskList.removeAll();
$('#job_task_table tbody tr').remove();
jobTaskViewModel.JobTaskList(ret.Result);
$('#job_task_table').gridgroup({ head: null, column: [0, 1], refresh: true });
}
else {
console.debug("任务统计失败," + obj.Result);
}
},

Table代码也可以改成

   <tbody data-bind="foreach:JobTaskList">

Model去掉多余的代码变成

       function JobTaskViewModel() {
var self = this;
self.JobTaskList = ko.observableArray([]);
}

这样写是不是感觉KO好清爽啊!!!!

有篇文章对于理解afterAdd执行三次做了说明:

afterAdd及beforeRemove函数会固定收到三个参数,element、index及data,其中 element 为模板容器中的各元素,

实际运作时afterAdd/beforeRemove会收到不同的element被呼叫三次,原因是除了<tr>之外,<tbody>到<tr>之间的空白、</tr>到</tbody>间的空白也各算一个Element,(FF和chrome是忽略这个空格的)其 nodeType 为3即TEXT_NODE, 代表TEXT_NODE。 因此三次传入的element分别为TEXT_NODE、ELEMENT_NODE、TEXT_NODE,而第二次传入的ELEMENT_NODE是<tr>...</tr>间的内容,才是我们需要处理的对象,故加入if (elems.nodeType == 1)的判断。

要注意,一旦调用了了beforeRemove,konckout.js就不再自动帮你移除该笔数据在网页对应的元素,必须自行处理,但这也提供开发人员绝对的控制权,可自由安排HTML元素要怎么从网页上退出。

knockoutjs+jquery.gridgroup 实现table数据加载和行合并的更多相关文章

  1. JQuery插件:遮罩+数据加载中。。。(特点:遮你想遮,罩你想罩)

    在很多项目中都会涉及到数据加载.数据加载有时可能会是2-3秒,为了给一个友好的提示,一般都会给一个[数据加载中...]的提示.今天就做了一个这样的提示框. 先去jQuery官网看看怎么写jQuery插 ...

  2. jQuery easyui datagrid 的数据加载

        其实easyuidatagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据:另一种是加载js对象,也就是使用loadDate方法,这种方法用于加载本地js数据(非ur ...

  3. [转载]再次谈谈easyui datagrid 的数据加载

    这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数 ...

  4. 谈谈easyui datagrid 的数据加载(转)

    这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数 ...

  5. 再次谈谈easyui datagrid 的数据加载

    from:http://www.easyui.info/archives/204.html 这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实ea ...

  6. 谈谈easyui datagrid 的数据加载

    文章目录 1url方式加载数据 1.1调用方式 1.2相关方法 1.3二次加载问题 2加载本地数据方式 2.1调用方式 2.2如何分页 2.3加载中效果 2.4如何不统计总数 这篇文章只谈jQuery ...

  7. jquery easyui easyui-treegrid 使用异步加载数据

    jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...

  8. JQuery 之 在数据加载完成后才自动执行函数

    数据加载完成执行: $(window).load(function(){ ... }); 进入页就执行,不论等数据是否加载完成: $(document).ready(function(){ ... } ...

  9. jQuery+Ajax滚屏异步加载数据实现(附源码)

    一.CSS样式 body { font:12px/1.0em Microsoft Yahei; line-height:1.6em; background:#fff; line-height:1.2e ...

随机推荐

  1. Android SDK在线更新镜像服务器大全

    http://www.androiddevtools.cn/ 原文:http://www.jb51.net/article/73732.htm 由于一些原因,Google相关很多服务都无法访问,所以在 ...

  2. SymmetricDS 数据库双向同步开源软件入门

    一句话概括该软件:SymmetricDS是一个文件和数据库同步软件,开源的,支持多主复制,同步时过滤和在异构的网络环境中进行数据转换传输.它支持单向和双向上的多个订阅者,异步的数据复制. 以下是从CS ...

  3. Sql中的Merge和output

    先看merge, 不用merge时: --更新 update TA Value ) --插入没有的数据 insert into TA ,,Value from TB ) and TypeName=@v ...

  4. Spring3系列11- Spring AOP——自动创建Proxy

    Spring3系列11- Spring AOP——自动创建Proxy 在<Spring3系列9- Spring AOP——Advice>和<Spring3系列10- Spring A ...

  5. 查看macbook是多少位

    Prince-2:~ snowinmay$ uname -aDarwin Prince-2.local 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 ...

  6. WebApi中直接返回json字符串的方法

    [HttpPost] public HttpResponseMessage Upload() { string json = "{\"result\":\"tr ...

  7. 安卓Android面试题大全

    56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...

  8. 没有 RunInstallerAttribute.Yes 的公共安装程序。在 C:/Program/xx.exe 程序集中可能可以找到

    今天在装服务的时候,装了半天总是提示 没有 RunInstallerAttribute.Yes 的公共安装程序.在 C:/Program/xx.exe 程序集中可能可以找到“Yes”属性. 才发现同事 ...

  9. Oracle 11g EM安全证书问题无法访问的解决办法

    OS: Windows Server 2012 Oracle: 11g R2 上一篇 Oracle 11g EM删除重建的方法 通过命令的方式重建了EM,启动也成功 emctl status dbco ...

  10. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...