Merge branch 'next' into components

This commit is contained in:
Leo Horie 2015-03-30 13:27:17 -04:00
commit dab565727c
5 changed files with 45 additions and 17 deletions

View file

@ -3,7 +3,7 @@
---
- [Usage](#usage)
- [Subtree directives](#subtree directives)
- [Subtree directives](#subtree-directives)
- [Signature](#signature)
---
@ -60,7 +60,7 @@ This mechanism is only intended to be used as a last resort optimization tool. I
The example below shows how to use a SubtreeDirective object to create a static header that doesn't incur diff costs once it has been rendered. This means that we are avoiding the creation of the header subtree (and therefore skipping the diff algorithm) altogether, but it also means that dynamic variables will NOT be updated within the header.
```
```javascript
var app = {}
//here's an example plugin that determines whether data has changes.
@ -78,7 +78,7 @@ app.bindOnce = (function() {
//here's the view
app.view = function() {
m(".layout", [
return m(".layout", [
app.bindOnce(function() {
//this only runs once in order to boost performance
//dynamic variables are not updated here

View file

@ -10,7 +10,7 @@
- [Casting the Response Data to a Class](#casting-the-response-data-to-a-class)
- [Unwrapping Response Data](#unwrapping-response-data)
- [Using Different Data Transfer Formats](#using-different-data-transfer-formats)
- [File uploads with FormData](#file-uploads-with-form-data)
- [File uploads with FormData](#file-uploads-with-formdata)
- [Using variable data formats](#using-variable-data-formats)
- [Extracting Metadata from the Response](#extracting-metadata-from-the-response)
- [Custom request rejections](#custom-request-rejections)

View file

@ -8,7 +8,7 @@
- [Running clean up code on route change](#running-clean-up-code-on-route-change)
- [Redirecting](#redirecting)
- [Reading the currently active route](#reading-the-currently-active-route)
- [Mode abstraction](#mode abstraction)
- [Mode abstraction](#mode-abstraction)
---

View file

@ -138,13 +138,15 @@ var m = (function app(window, undefined) {
existing[cached[i].attrs.key] = {action: DELETION, index: i}
}
}
data = data.filter(function(x) {return x != null})
var guid = 0
for (var i = 0, len = data.length; i < len; i++) {
if (data[i] && data[i].attrs && data[i].attrs.key == null) data[i].attrs.key = "__mithril__" + guid++
}
if (shouldMaintainIdentities) {
if (data.indexOf(null) > -1) data = data.filter(function(x) {return x != null})
var keysDiffer = false
if (data.length != cached.length) keysDiffer = true
else for (var i = 0, cachedCell, dataCell; cachedCell = cached[i], dataCell = data[i]; i++) {

View file

@ -43,6 +43,32 @@ function testMithril(mock) {
test(function() {return m("div", [1], [2], [3]).children.length === 3})
//m.module
test(function() {
var root = mock.document.createElement("div")
var whatever = 1
var app = {
view: function() {
return [
whatever % 2 ? m('span', '% 2') : undefined,
m('div', 'bugs'),
m('a'),
]
}
}
m.module(root, app)
mock.requestAnimationFrame.$resolve()
whatever++
m.redraw()
mock.requestAnimationFrame.$resolve()
whatever++
m.redraw()
mock.requestAnimationFrame.$resolve()
return root.childNodes.length
})
test(function() {
mock.requestAnimationFrame.$resolve()
@ -983,7 +1009,7 @@ function testMithril(mock) {
test(function() {
var root = mock.document.createElement("div")
m.render(root, m("div", [undefined]))
return root.childNodes[0].childNodes[0].nodeValue === ""
return root.childNodes[0].childNodes.length === 0
})
test(function() {
var root = mock.document.createElement("div")
@ -1006,19 +1032,19 @@ function testMithril(mock) {
var root = mock.document.createElement("div")
m.render(root, m("ul", [m("li")]))
m.render(root, m("ul", [m("li"), undefined]))
return root.childNodes[0].childNodes[1].nodeValue === ""
return root.childNodes[0].childNodes.length == 1
})
test(function() {
var root = mock.document.createElement("div")
m.render(root, m("ul", [m("li"), m("li")]))
m.render(root, m("ul", [m("li"), undefined]))
return root.childNodes[0].childNodes.length == 2 && root.childNodes[0].childNodes[1].nodeValue === ""
return root.childNodes[0].childNodes.length == 1
})
test(function() {
var root = mock.document.createElement("div")
m.render(root, m("ul", [m("li")]))
m.render(root, m("ul", [undefined]))
return root.childNodes[0].childNodes[0].nodeValue === ""
return root.childNodes[0].childNodes.length == 0
})
test(function() {
var root = mock.document.createElement("div")
@ -1201,18 +1227,18 @@ function testMithril(mock) {
m.render(root, m("div", [m("button"), m("ul")]))
var valueBefore = root.childNodes[0].childNodes[0].nodeName
m.render(root, m("div", [undefined, m("ul")]))
var valueAfter = root.childNodes[0].childNodes[0].nodeValue
return valueBefore === "BUTTON" && valueAfter === ""
var valueAfter = root.childNodes[0].childNodes[0].nodeName
return valueBefore === "BUTTON" && valueAfter === "UL"
})
test(function() {
var root = mock.document.createElement("div")
m.render(root, m("div", [m("ul"), undefined]))
var valueBefore1 = root.childNodes[0].childNodes[0].nodeName
var valueBefore2 = root.childNodes[0].childNodes[1].nodeValue
var valueBefore2 = root.childNodes[0].childNodes.length
m.render(root, m("div", [undefined, m("ul")]))
var valueAfter1 = root.childNodes[0].childNodes[0].nodeValue
var valueAfter2 = root.childNodes[0].childNodes[1].nodeName
return valueBefore1 === "UL" && valueAfter1 === "" && valueBefore2 === "" && valueAfter2 === "UL"
var valueAfter1 = root.childNodes[0].childNodes[0].nodeName
var valueAfter2 = root.childNodes[0].childNodes.length
return valueBefore1 === "UL" && valueAfter1 === "UL" && valueBefore2 === 1 && valueAfter2 === 1
})
test(function() {
//https://github.com/lhorie/mithril.js/issues/79