|
1093 | 1093 | }, |
1094 | 1094 | applyDiff: function(tree, diff) { |
1095 | 1095 | var node = this.getFromRoute(tree, diff.route), |
1096 | | - newNode, reference, route, groupLength, from, to, child, c, i; |
| 1096 | + newNode, reference, route, c; |
1097 | 1097 |
|
1098 | 1098 | switch (diff.action) { |
1099 | 1099 | case 'addAttribute': |
|
1145 | 1145 | node.selected = diff.newValue; |
1146 | 1146 | break; |
1147 | 1147 | case 'replaceElement': |
1148 | | - newNode = objToNode(diff.newValue); |
1149 | | - node.parentNode.replaceChild(newNode, node); |
| 1148 | + node.parentNode.replaceChild(objToNode(diff.newValue), node); |
1150 | 1149 | break; |
1151 | 1150 | case 'relocateGroup': |
1152 | | - groupLength = diff.groupLength; |
1153 | | - from = diff.from; |
1154 | | - to = diff.to; |
1155 | | - reference = node.childNodes[to + groupLength]; |
1156 | | - // slide elements up |
1157 | | - if (from < to) { |
1158 | | - for (i = 0; i < groupLength; i += 1) { |
1159 | | - child = node.childNodes[from]; |
1160 | | - node.insertBefore(child, reference); |
| 1151 | + Array.apply(null, new Array(diff.groupLength)).map(function() { |
| 1152 | + return node.removeChild(node.childNodes[diff.from]); |
| 1153 | + }).forEach(function(childNode, index){ |
| 1154 | + if(index===0) { |
| 1155 | + reference = node.childNodes[diff.to]; |
1161 | 1156 | } |
1162 | | - } else { |
1163 | | - // slide elements down |
1164 | | - reference = node.childNodes[to]; |
1165 | | - for (i = 0; i < groupLength; i += 1) { |
1166 | | - child = node.childNodes[from + i]; |
1167 | | - node.insertBefore(child, reference); |
1168 | | - } |
1169 | | - } |
| 1157 | + node.insertBefore(childNode,reference); |
| 1158 | + }); |
1170 | 1159 | break; |
1171 | 1160 | case 'removeElement': |
1172 | 1161 | node.parentNode.removeChild(node); |
|
1175 | 1164 | route = diff.route.slice(); |
1176 | 1165 | c = route.splice(route.length - 1, 1)[0]; |
1177 | 1166 | node = this.getFromRoute(tree, route); |
1178 | | - newNode = objToNode(diff.element); |
1179 | | - if (c >= node.childNodes.length) { |
1180 | | - node.appendChild(newNode); |
1181 | | - } else { |
1182 | | - reference = node.childNodes[c]; |
1183 | | - node.insertBefore(newNode, reference); |
1184 | | - } |
| 1167 | + node.insertBefore(objToNode(diff.element), node.childNodes[c]); |
1185 | 1168 | break; |
1186 | 1169 | case 'removeTextElement': |
1187 | 1170 | if (!node || node.nodeType !== 3) { |
|
1197 | 1180 | if (!node || !node.childNodes) { |
1198 | 1181 | return false; |
1199 | 1182 | } |
1200 | | - if (c >= node.childNodes.length) { |
1201 | | - node.appendChild(newNode); |
1202 | | - } else { |
1203 | | - reference = node.childNodes[c]; |
1204 | | - node.insertBefore(newNode, reference); |
1205 | | - } |
| 1183 | + node.insertBefore(newNode, node.childNodes[c]); |
1206 | 1184 | break; |
1207 | 1185 | default: |
1208 | 1186 | console.log('unknown action'); |
|
0 commit comments