|
1 | 1 | ObservableArray.prototype.addDomObserver = (function() {
|
2 | 2 |
|
| 3 | + var nodeMap = new Map(); |
| 4 | + |
3 | 5 | // renderer will be called for each item in arr, and should return a DOM node.
|
4 | 6 | // renderAll returns a single node containing the rendered nodes
|
5 | 7 | function renderAll(arr, renderer) {
|
6 | 8 | var elements = [].map.call(arr, function(obj) {
|
7 |
| - return obj.node = renderer.apply(null, arguments); |
| 9 | + var node = renderer.apply(null, arguments); |
| 10 | + nodeMap.set(obj, node); |
| 11 | + return node; |
8 | 12 | });
|
9 | 13 |
|
10 | 14 | if (elements.length > 1) {
|
@@ -63,23 +67,36 @@ ObservableArray.prototype.addDomObserver = (function() {
|
63 | 67 | }
|
64 | 68 | observableArray.on('splice', handleSplice);
|
65 | 69 |
|
| 70 | + function handleReverse() { |
| 71 | + var docFrag = document.createDocumentFragment(); |
| 72 | + while (parent.lastChild) { |
| 73 | + docFrag.appendChild( |
| 74 | + parent.removeChild(parent.lastChild) |
| 75 | + ); |
| 76 | + } |
| 77 | + parent.appendChild(docFrag); |
| 78 | + } |
| 79 | + observableArray.on('reverse', handleReverse); |
| 80 | + |
66 | 81 | function handleReorder() {
|
67 | 82 | var docFrag = document.createDocumentFragment();
|
68 | 83 | observableArray.forEach(function(obj){
|
69 |
| - parent.removeChild(obj.node); |
70 |
| - docFrag.appendChild(obj.node); |
| 84 | + var node = nodeMap.get(obj); |
| 85 | + parent.removeChild(node); |
| 86 | + docFrag.appendChild(node); |
71 | 87 | });
|
72 | 88 | parent.appendChild(docFrag);
|
73 | 89 | }
|
74 |
| - observableArray.on('reverse sort', handleReorder); |
| 90 | + observableArray.on('sort', handleReorder); |
75 | 91 |
|
76 | 92 | return {
|
77 | 93 | stop: function() {
|
78 | 94 | observableArray
|
79 | 95 | .off('unshift push', handleAdd)
|
80 | 96 | .off('shift pop', handleRemove)
|
81 | 97 | .off('splice', handleSplice)
|
82 |
| - .off('reverse sort', handleReorder); |
| 98 | + .off('reverse', handleReverse) |
| 99 | + .off('sort', handleReorder); |
83 | 100 | }
|
84 | 101 | }
|
85 | 102 | };
|
|
0 commit comments