diff --git a/render/render.js b/render/render.js index c31a79ce..9a579a66 100644 --- a/render/render.js +++ b/render/render.js @@ -124,9 +124,16 @@ module.exports = function($window) { else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) else if (vnodes == null) removeNodes(old, 0, old.length, vnodes) else { - if (old.length === vnodes.length && vnodes[0] != null && vnodes[0].key == null) { + var isUnkeyed = false + for (var i = 0; i < vnodes.length; i++) { + if (vnodes[i] != null) { + isUnkeyed = vnodes[i].key == null + break + } + } + if (old.length === vnodes.length && isUnkeyed) { for (var i = 0; i < old.length; i++) { - if (old[i] === vnodes[i] || old[i] == null && vnodes[i] == null) continue + if (old[i] === vnodes[i]) continue else if (old[i] == null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes) else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns) diff --git a/render/tests/test-updateNodes.js b/render/tests/test-updateNodes.js index e56a828c..8614b162 100644 --- a/render/tests/test-updateNodes.js +++ b/render/tests/test-updateNodes.js @@ -879,4 +879,17 @@ o.spec("updateNodes", function() { o(onupdate.callCount).equals(0) }) + o("null stays in place", function() { + var vnodes = [{tag: "div"}, {tag: "a"}] + var temp = [null, {tag: "a"}] + var updated = [{tag: "div"}, {tag: "a"}] + + render(root, vnodes) + var before = vnodes[1].dom + render(root, temp) + render(root, updated) + var after = updated[1].dom + + o(before).equals(after) + }) })