From 904f4ee34aaa8e531a918e6708cd83c009dc79d8 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 13 Mar 2015 23:22:54 -0400 Subject: [PATCH] #463 don't try to manage 3rd party dom element when using keys --- mithril.js | 6 ++++-- tests/mithril-tests.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/mithril.js b/mithril.js index d0633555..5a5624d4 100644 --- a/mithril.js +++ b/mithril.js @@ -169,6 +169,7 @@ var m = (function app(window, undefined) { for (var prop in existing) actions.push(existing[prop]) var changes = actions.sort(sortChanges); var newCached = new Array(cached.length) + newCached.nodes = [] for (var i = 0, change; change = changes[i]; i++) { if (change.action === DELETION) { @@ -180,6 +181,7 @@ var m = (function app(window, undefined) { dummy.key = data[change.index].attrs.key; parentElement.insertBefore(dummy, parentElement.childNodes[change.index] || null); newCached.splice(change.index, 0, {attrs: {key: data[change.index].attrs.key}, nodes: [dummy]}) + newCached.nodes[change.index] = dummy } if (change.action === MOVE) { @@ -187,16 +189,16 @@ var m = (function app(window, undefined) { parentElement.insertBefore(change.element, parentElement.childNodes[change.index] || null) } newCached[change.index] = cached[change.from] + newCached.nodes[change.index] = change.element } } for (var i = 0, len = unkeyed.length; i < len; i++) { var change = unkeyed[i]; parentElement.insertBefore(change.element, parentElement.childNodes[change.index] || null); newCached[change.index] = cached[change.index] + newCached.nodes[change.index] = change.element } cached = newCached; - cached.nodes = new Array(parentElement.childNodes.length); - for (var i = 0, child; child = parentElement.childNodes[i]; i++) cached.nodes[i] = child } } //end key algorithm diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index 911bb3e9..56f861d4 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -119,6 +119,44 @@ function testMithril(mock) { return initCount == 1 }) + test(function() { + var root = mock.document.createElement("div") + + var dom = mock.document.createElement("div") + + var show = true + + var module = { + view: function() { + return [ + m(".foo", {key: 1, config: test, onclick: function() {show = !show}}), + show ? m(".bar", {key: 2}) : null + ] + } + } + + function test(el, init) { + if (!init) { + root.appendChild(dom) + } + } + + m.module(root, module) + + mock.requestAnimationFrame.$resolve() + + show = false + m.redraw() + + mock.requestAnimationFrame.$resolve() + + show = true + m.redraw() + + mock.requestAnimationFrame.$resolve() + + return root.childNodes.length == 3 + }) m.redraw.strategy(undefined) //teardown for m.module tests //m.withAttr