http://blog.csdn.net/maddemon/article/details/16846183

目前仅支持URL的CRUD。不需要的话可以却掉相关代码,把treegrid的data直接赋值给viewModel,然后用ko提交整个data

1、支持双击编辑

2、单击Cell,自动保存编辑。

3、4个功能按钮。

插件源码:

  1. ko.bindingHandlers.etreegrid = {
  2. editing: false,
  3. editIndex: 0,
  4. init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
  5. var self = ko.bindingHandlers.etreegrid;
  6. var opts = valueAccessor();
  7. $(element).treegrid({
  8. url: opts.url,
  9. treeField: opts.treeField,
  10. idField: opts.idField,
  11. onDblClickRow: function (node) {
  12. if (viewModel.add)
  13. editRow(node);
  14. },
  15. onClickCell: function () {
  16. if (viewModel.add) {
  17. saveRow();
  18. }
  19. }
  20. });
  21. viewModel.add = function () {
  22. addRow(getSelectedRow());
  23. };
  24. viewModel.edit = function () {
  25. editRow(getSelectedRow());
  26. };
  27. viewModel.remove = function () {
  28. removeRow(getSelectedRow());
  29. };
  30. viewModel.cancel = function () {
  31. var node = getSelectedRow();
  32. if (viewModel.onCancel) {
  33. viewModel.onCancel(node);
  34. }
  35. $(element).treegrid("unselectAll");
  36. try {
  37. if (self.editing) {
  38. $(element).treegrid("cancelEdit", self.editIndex);
  39. $(element).treegrid("refresh", self.editIndex);
  40. self.editing = false;
  41. }
  42. } catch (ex) {
  43. self.editing = false;
  44. self.editIndex = 0;
  45. }
  46. };
  47. function getSelectedRow() {
  48. return $(element).treegrid("getSelected");
  49. }
  50. function saveRow() {
  51. var rowIndex = self.editIndex;
  52. if (rowIndex == 0) {
  53. return;
  54. }
  55. self.editIndex = 0;
  56. self.editing = false;
  57. $(element).treegrid("endEdit", rowIndex);
  58. $.ajax({
  59. async: false,
  60. url: opts.saveUrl,
  61. method: "POST",
  62. data: $(element).treegrid("find", rowIndex),
  63. success: function (data) {
  64. $(element).treegrid("refresh", rowIndex);
  65. if (viewModel.onSaved) {
  66. viewModel.onSaved(data, rowIndex);
  67. }
  68. },
  69. error: function () {
  70. }
  71. });
  72. }
  73. function editRow(node) {
  74. if (!node || node[opts.idField] == self.editIndex) return;
  75. saveRow();
  76. self.editing = true;
  77. self.editIndex = node[opts.idField];
  78. $(element).treegrid('select', self.editIndex);
  79. $(element).treegrid("beginEdit", self.editIndex);
  80. if (viewModel.onEditing) {
  81. viewModel.onEditing(node);
  82. }
  83. }
  84. function addRow(parentNode) {
  85. if (self.editing) return;
  86. var parentId = parentNode ? parentNode[opts.idField] : 0;
  87. var newNode = viewModel.newNode(parentId);
  88. $(element).treegrid("append", { parent: parentId, data: [newNode] });
  89. editRow(newNode);
  90. }
  91. function removeRow(node) {
  92. if (!node) return;
  93. if (viewModel.onRemoving && !viewModel.onRemoving(node)) {
  94. return;
  95. }
  96. $.messager.confirm('确认', '你确定要删除吗?', function (r) {
  97. if (!r) return;
  98. $.post(opts.deleteUrl + "?id=" + node[opts.idField], function (data, statusText) {
  99. if (viewModel.onRemoved) {
  100. viewModel.onRemoved(data);
  101. }
  102. else {
  103. if (statusText == "success") {
  104. $(element).treegrid("remove", node[opts.idField]);
  105. }
  106. else {
  107. $.messager.alert('警告', "删除失败", 'warning');
  108. }
  109. }
  110. });
  111. });
  112. }
  113. }
  114. };

使用示例:

HTML:

  1. <div id="area-form">
  2. <div id="area-tool-bar">
  3. <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-add" plain="true" data-bind="click: add">新增</a>
  4. <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-edit" plain="true" data-bind="click: edit">编辑</a>
  5. <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-remove" plain="true" data-bind="click: remove">删除</a>
  6. <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-cancel" plain="true" data-bind="click: cancel">取消</a>
  7. </div>
  8. <table id="area-list" rownumbers="true" title="区域列表" border="0" toolbar="#area-tool-bar" data-bind="etreegrid: tree">
  9. <thead>
  10. <tr>
  11. <th field="Name" width="500" data-options="editor:{type:'validatebox'}">地区名称</th>
  12. <th field="Code" width="120" data-options="editor:{type:'validatebox'}">地区编码</th>
  13. </tr>
  14. </thead>
  15. </table>
  16. </div>

Javascript:

    1. (function () {
    2. var newId = 9999999;
    3. var listId = "#area-list";
    4. function AreaModel() {
    5. this.tree = {
    6. url: "/area/gettree",
    7. treeField: "Name",
    8. idField: "ID",
    9. saveUrl: "/area/save",
    10. deleteUrl: "/area/delete",
    11. };
    12. this.newNode = function (parentId) {
    13. return { ID: newId, Name: '', Code: '', ParentID: parentId };
    14. };
    15. this.add = ko.observable();
    16. this.edit = ko.observable();
    17. this.remove = ko.observable();
    18. this.cancel = ko.observable();
    19. this.validate = function (node) {
    20. return !!node.Name;
    21. };
    22. this.onCancel = function (node) {
    23. if (node && node.ID == newId) {
    24. $(listId).treegrid("remove", node.ID);
    25. }
    26. };
    27. this.onSaved = function (data, editIndex) {
    28. if (data.result) {
    29. var row = data.data;
    30. if (editIndex == newId) {
    31. $(listId).treegrid("remove", editIndex);
    32. $(listId).treegrid("append", { parent: row.ParentID, data: [data.data] });
    33. }
    34. }
    35. };
    36. this.onRemoving = function (node) {
    37. if (node.ID == newId) {
    38. $(listId).treegrid("remove", node.ID);
    39. return false;
    40. }
    41. else {
    42. if (!node.children || node.children.length > 0) {
    43. $.messager.alert('删除失败', "该地区有下属分类,不可直接删除!", 'warning');
    44. return false;
    45. }
    46. }
    47. return true;
    48. };
    49. };
    50. ko.applyBindings(new AreaModel(), document.getElementById("area-form"));
    51. })();

knockoutjs + easyui.treegrid 可编辑的自定义绑定插件的更多相关文章

  1. Maven自定义绑定插件目标:创建项目的源码jar

    <build> <plugins> <!-- 自定义绑定,创建项目的源码jar --> <plugin> <groupId>org.apac ...

  2. .net mvc mssql easyui treegrid 及时 编辑 ,支持拖拽

    这里提到了,1个问题,怎么扩展 Easyui 参见: http://blog.csdn.net/chenkai6529/article/details/17528833 @{ ViewBag.Titl ...

  3. EasyUI treegrid 获取编辑状态中某字段的值 [getEditor方法获取不到editor]

    如题,在treegrid里,按照api里getEditor方法的说明, getEditoroptionsGet the specified editor, the options contains t ...

  4. KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定

    除了ko内建的绑定,还可以自定义绑定,灵活地封装复杂的行为使之可重用. 自定义绑定 注册自定义绑定 向 ko.bindingHandles添加一个子属性来注册一个绑定. ko.bindingHandl ...

  5. EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他

    原创 : EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他 转载,请注明出处哦!谢谢! 原创 : EasyUI datagrid 明细表格中编辑框 事件绑 ...

  6. KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定

    您不仅限于使用内置的绑定,如click,value绑定等,您可以创建自己的绑定. 这是如何控制视图模型如何与DOM元素进行交互,并且为您提供了大量的灵活性,以便于以复用的方式封装复杂的行为. 注册绑定 ...

  7. 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格

    EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...

  8. 基于EasyUI Treegrid的权限管理资源列表

    1. 前言 最近在开发系统权限管理相关的功能,主要包含用户管理,资源管理,角色管理,组类别管理等小的模块.之前的Web开发中也用过jQueryEasyUI插件,感觉这款插件简单易用,上手很快.以前用到 ...

  9. 5.Knockout.Js(自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

随机推荐

  1. openstack通过salt-cloud创建虚拟机

    saltstack有三大功能:远程执行.配置管理.云管理:saltstack的云管理就是通过salt-cloud完成的,salt-cloud是基于openstack来做的:salt-cloud能够管理 ...

  2. iOS页面传值方式

    普遍传值方式如下: 1.委托delegate方式: 2.通知notification方式: 3.block方式: 4.UserDefault或者文件方式: 5.单例模式方式: 6.通过设置属性,实现页 ...

  3. NOI 1.7编程基础之字符串(35题)

    01:统计数字字符个数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 ...

  4. 【MySQL】PREPARE 的应用

    简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变 ...

  5. 2015某编程网易语言vip课堂全套教程 包含post,hook入门到精通等

    2015某编程网易语言vip课堂全套教程 包含post,hook入门到精通等  官方论坛弄来的  如果在官方下载需要权限的  挺不错教程 想学习易语言入门到精通 post hook  js改写的可以看 ...

  6. LeetCode 笔记27 Two Sum III - Data structure design

    Design and implement a TwoSum class. It should support the following operations: add and find. add - ...

  7. Logparser 的用法

    Logparser是一款非常强大的日志分析软件,可以帮助你详细的分析网站日志.是所有数据分析和网站优化人员都应该会的一个软件.Logparser是微软的一款软件完全免费的,大家可以在微软的官网上去下载 ...

  8. [转]MySQL Explain详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  9. angular实现了一个简单demo,angular-weibo-favorites

    前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...

  10. js中的DOM操作(2)

    1.表格的更加与删除 <!DOCTYPE html> <html> <head> <title>表格操作</title> <style ...