diff --git a/docs/change-log.md b/docs/change-log.md index c32a8b7c..7347af50 100644 --- a/docs/change-log.md +++ b/docs/change-log.md @@ -13,6 +13,7 @@ - gracefully degrade on IE exceptions when setting invalid values - fixes for Typescript definition file +- fixed bug in keys algorithm when mixing keyed and unkeyed elements [#246](https://github.com/lhorie/mithril.js/issues/246) --- diff --git a/docs/components.md b/docs/components.md index 712cfe5e..bb73900f 100644 --- a/docs/components.md +++ b/docs/components.md @@ -99,7 +99,7 @@ autocompleter.controller = function(data, getter) { this.change = function(value) { this.value(value); - var list = value === "" ? [] : data.filter(function(item) { + var list = value === "" ? [] : data().filter(function(item) { return this.getter(item).toLowerCase().indexOf(value.toLowerCase()) > -1; }, this); this.data(list); @@ -130,7 +130,7 @@ var dashboard = {} dashboard.controller = function() { this.names = m.prop([{id: 1, name: "John"}, {id: 2, name: "Bob"}, {id: 2, name: "Mary"}]); - this.autocompleter = new autocompleter.controller(this.names(), function(item) { + this.autocompleter = new autocompleter.controller(this.names, function(item) { return item.name; }); }; diff --git a/docs/mithril.deferred.md b/docs/mithril.deferred.md index 8f07ed19..00e5196a 100644 --- a/docs/mithril.deferred.md +++ b/docs/mithril.deferred.md @@ -119,7 +119,7 @@ var greetAsync = function() { ### Differences from Promises/A+ -For the most part, Mithril promises behave as you'd expect a [Promise/A+](http://promises-aplus.github.io/promises-spec/) promise to behave, but they have a few differences. +For the most part, Mithril promises behave as you'd expect a [Promise/A+](http://promises-aplus.github.io/promises-spec/) promise to behave, but have one difference: Mithril promises attempt to execute synchronously if possible. #### Synchronous execution diff --git a/mithril.js b/mithril.js index 40064b93..93f8f375 100644 --- a/mithril.js +++ b/mithril.js @@ -118,7 +118,7 @@ Mithril = m = new function app(window, undefined) { 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]} } - else unkeyed.push({index: i, element: parentElement.childNodes[i]}) + else unkeyed.push({index: i, element: parentElement.childNodes[i] || window.document.createElement("div")}) } } var actions = Object.keys(existing).map(function(key) {return existing[key]}) diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index b3560c79..9c9f95cd 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -584,6 +584,17 @@ function testMithril(mock) { var fifthAfter = root.childNodes[1] return firstBefore === firstAfter && secondBefore === secondAfter && thirdBefore === thirdAfter && fourthBefore === fourthAfter && fifthBefore === fifthAfter }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/246 + //insert at beginning with non-keyed in the middle + var root = mock.document.createElement("div") + m.render(root, [m("a", {key: 1})]) + var firstBefore = root.childNodes[0] + m.render(root, [m("a", {key: 2}), m("br"), m("a", {key: 1})]) + var firstAfter = root.childNodes[2] + console.log(root.childNodes) + return firstBefore == firstAfter && root.childNodes[0].key == 2 && root.childNodes.length == 3 + }) test(function() { //https://github.com/lhorie/mithril.js/issues/134 var root = mock.document.createElement("div") diff --git a/tests/mock.js b/tests/mock.js index fae3574e..660f08f4 100644 --- a/tests/mock.js +++ b/tests/mock.js @@ -15,7 +15,11 @@ mock.window = new function() { insertBefore: function(node, reference) { node.parentNode = this var referenceIndex = this.childNodes.indexOf(reference) - if (referenceIndex < 0) this.childNodes.push(node) + if (referenceIndex < 0) { + var index = this.childNodes.indexOf(node) + if (index > -1) this.childNodes.splice(index, 1) + this.childNodes.push(node) + } else { var index = this.childNodes.indexOf(node) if (index > -1) this.childNodes.splice(index, 1)