#424 fix key association when DOM is modified by external code

This commit is contained in:
Leo Horie 2015-01-27 20:53:58 -05:00
parent aacc618dfd
commit 496d820ee3
3 changed files with 27 additions and 6 deletions

View file

@ -5,11 +5,15 @@
### News:
- Calling m.module without a module now unloads the current one [#420](https://github.com/lhorie/mithril.js/issues/420)
- Both `controller` and `view` properties in modules are now optional
### Bug Fixes:
- prevent empty class attributes [#382](https://github.com/lhorie/mithril.js/issues/382)
- array-to-querystring serialization in `m.request` now behaves like jQuery [#426](https://github.com/lhorie/mithril.js/issues/426)
- fix querystring detection bug in pathname mode [#425](https://github.com/lhorie/mithril.js/issues/425)
- don't add history entry if reloading from a link [#428](https://github.com/lhorie/mithril.js/issues/428)
- fix key association when DOM order is modified by external code [#424](https://github.com/lhorie/mithril.js/issues/424)
---

View file

@ -133,7 +133,7 @@ var m = (function app(window, undefined) {
for (var i = 0; i < cached.length; i++) {
if (cached[i] && cached[i].attrs && cached[i].attrs.key != null) {
shouldMaintainIdentities = true;
existing[cached[i].attrs.key] = {action: DELETION, index: i}
existing[cached[i].attrs.key] = {action: DELETION, index: i, element: cached[i].nodes[0]}
}
}
if (shouldMaintainIdentities) {
@ -154,11 +154,13 @@ var m = (function app(window, undefined) {
if (data[i].attrs.key != null) {
var key = data[i].attrs.key;
if (!existing[key]) existing[key] = {action: INSERTION, index: i};
else existing[key] = {
action: MOVE,
index: i,
from: existing[key].index,
element: parentElement.childNodes[existing[key].index] || $document.createElement("div")
else {
existing[key] = {
action: MOVE,
index: i,
from: existing[key].index,
element: existing[key].element || $document.createElement("div")
}
}
}
else unkeyed.push({index: i, element: parentElement.childNodes[i] || $document.createElement("div")})

View file

@ -828,6 +828,21 @@ function testMithril(mock) {
m.render(root, m("div", [console.log()])) //don't throw in Firefox
return true
})
test(function() {
var root = mock.document.createElement("div")
m.render(root, [
m("#div-1", {key: 1}),
m("#div-2", {key: 2}),
m("#div-3", {key: 3})
])
root.appendChild(root.childNodes[1])
m.render(root, [
m("#div-1", {key: 1}),
m("#div-3", {key: 3}),
m("#div-2", {key: 2})
])
return root.childNodes.map(function(node) {return node.id}).join() == "div-1,div-3,div-2"
})
//end m.render
//m.redraw