patch.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /**
  2. * @fileOverview
  3. *
  4. * 打补丁
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. define(function(require, exports, module) {
  10. var kity = require('./kity');
  11. var Minder = require('./minder');
  12. function insertNode(minder, info, parent, index) {
  13. parent = minder.createNode(info.data, parent, index);
  14. info.children.forEach(function(childInfo, index) {
  15. insertNode(minder, childInfo, parent, index);
  16. });
  17. return parent;
  18. }
  19. function applyPatch(minder, patch) {
  20. // patch.op - 操作,包括 remove, add, replace
  21. // patch.path - 路径,如 '/root/children/1/data'
  22. // patch.value - 数据,如 { text: "思路" }
  23. var path = patch.path.split('/');
  24. path.shift();
  25. var changed = path.shift();
  26. var node;
  27. if (changed == 'root') {
  28. var dataIndex = path.indexOf('data');
  29. if (dataIndex > -1) {
  30. changed = 'data';
  31. var dataPath = path.splice(dataIndex + 1);
  32. patch.dataPath = dataPath;
  33. } else {
  34. changed = 'node';
  35. }
  36. node = minder.getRoot();
  37. var segment, index;
  38. while (segment = path.shift()) {
  39. if (segment == 'children') continue;
  40. if (typeof index != 'undefined') node = node.getChild(index);
  41. index = +segment;
  42. }
  43. patch.index = index;
  44. patch.node = node;
  45. }
  46. var express = patch.express = [changed, patch.op].join('.');
  47. switch (express) {
  48. case 'theme.replace':
  49. minder.useTheme(patch.value);
  50. break;
  51. case 'template.replace':
  52. minder.useTemplate(patch.value);
  53. break;
  54. case 'node.add':
  55. insertNode(minder, patch.value, patch.node, patch.index).renderTree();
  56. minder.layout();
  57. break;
  58. case 'node.remove':
  59. minder.removeNode(patch.node.getChild(patch.index));
  60. minder.layout();
  61. break;
  62. case 'data.add':
  63. case 'data.replace':
  64. case 'data.remove':
  65. var data = patch.node.data;
  66. var field;
  67. path = patch.dataPath.slice();
  68. while (data && path.length > 1) {
  69. field = path.shift();
  70. if (field in data) {
  71. data = data[field];
  72. } else if (patch.op != 'remove') {
  73. data = data[field] = {};
  74. }
  75. }
  76. if (data) {
  77. field = path.shift();
  78. data[field] = patch.value;
  79. }
  80. if (field == 'expandState') {
  81. node.renderTree();
  82. } else {
  83. node.render();
  84. }
  85. minder.layout();
  86. }
  87. minder.fire('patch', { 'patch' : patch } );
  88. }
  89. kity.extendClass(Minder, {
  90. applyPatches: function(patches) {
  91. for (var i = 0; i < patches.length; i++) {
  92. applyPatch(this, patches[i]);
  93. }
  94. this.fire('contentchange');
  95. return this;
  96. }
  97. });
  98. });