Skip to content

Commit e2c28b7

Browse files
committed
Merge branch 'rewrite-sort'
2 parents ae4c47b + 35ddf77 commit e2c28b7

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

dom-observer.js

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
ObservableArray.prototype.addDomObserver = (function() {
22

3+
var nodeMap = new Map();
4+
35
// renderer will be called for each item in arr, and should return a DOM node.
46
// renderAll returns a single node containing the rendered nodes
57
function renderAll(arr, renderer) {
68
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;
812
});
913

1014
if (elements.length > 1) {
@@ -63,23 +67,36 @@ ObservableArray.prototype.addDomObserver = (function() {
6367
}
6468
observableArray.on('splice', handleSplice);
6569

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+
6681
function handleReorder() {
6782
var docFrag = document.createDocumentFragment();
6883
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);
7187
});
7288
parent.appendChild(docFrag);
7389
}
74-
observableArray.on('reverse sort', handleReorder);
90+
observableArray.on('sort', handleReorder);
7591

7692
return {
7793
stop: function() {
7894
observableArray
7995
.off('unshift push', handleAdd)
8096
.off('shift pop', handleRemove)
8197
.off('splice', handleSplice)
82-
.off('reverse sort', handleReorder);
98+
.off('reverse', handleReverse)
99+
.off('sort', handleReorder);
83100
}
84101
}
85102
};

0 commit comments

Comments
 (0)