context reuse flag
This commit is contained in:
parent
e9eb03285a
commit
84f472cb9e
2 changed files with 429 additions and 17 deletions
10
mithril.js
10
mithril.js
|
|
@ -238,7 +238,7 @@ var m = (function app(window, undefined) {
|
||||||
var dataAttrKeys = Object.keys(data.attrs)
|
var dataAttrKeys = Object.keys(data.attrs)
|
||||||
var hasKeys = dataAttrKeys.length > ("key" in data.attrs ? 1 : 0)
|
var hasKeys = dataAttrKeys.length > ("key" in data.attrs ? 1 : 0)
|
||||||
//if an element is different enough from the one in cache, recreate it
|
//if an element is different enough from the one in cache, recreate it
|
||||||
if (data.tag != cached.tag || dataAttrKeys.join() != Object.keys(cached.attrs).join() || data.attrs.id != cached.attrs.id) {
|
if (data.tag != cached.tag || dataAttrKeys.join() != Object.keys(cached.attrs).join() || data.attrs.id != cached.attrs.id || (m.redraw.strategy() == "all" && cached.configContext && cached.configContext.reuse !== true) || (m.redraw.strategy() == "diff" && cached.configContext && cached.configContext.reuse === false)) {
|
||||||
if (cached.nodes.length) clear(cached.nodes);
|
if (cached.nodes.length) clear(cached.nodes);
|
||||||
if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) cached.configContext.onunload()
|
if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) cached.configContext.onunload()
|
||||||
}
|
}
|
||||||
|
|
@ -391,7 +391,10 @@ var m = (function app(window, undefined) {
|
||||||
if (nodes.length != 0) nodes.length = 0
|
if (nodes.length != 0) nodes.length = 0
|
||||||
}
|
}
|
||||||
function unload(cached) {
|
function unload(cached) {
|
||||||
if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) cached.configContext.onunload();
|
if (cached.configContext && typeof cached.configContext.onunload === FUNCTION) {
|
||||||
|
cached.configContext.onunload();
|
||||||
|
cached.configContext.onunload = null
|
||||||
|
}
|
||||||
if (cached.children) {
|
if (cached.children) {
|
||||||
if (type.call(cached.children) === ARRAY) {
|
if (type.call(cached.children) === ARRAY) {
|
||||||
for (var i = 0, child; child = cached.children[i]; i++) unload(child)
|
for (var i = 0, child; child = cached.children[i]; i++) unload(child)
|
||||||
|
|
@ -540,10 +543,9 @@ var m = (function app(window, undefined) {
|
||||||
m.redraw.strategy = m.prop();
|
m.redraw.strategy = m.prop();
|
||||||
var blank = function() {return ""}
|
var blank = function() {return ""}
|
||||||
function redraw() {
|
function redraw() {
|
||||||
var forceRedraw = m.redraw.strategy() === "all";
|
|
||||||
for (var i = 0, root; root = roots[i]; i++) {
|
for (var i = 0, root; root = roots[i]; i++) {
|
||||||
if (controllers[i]) {
|
if (controllers[i]) {
|
||||||
m.render(root, modules[i].view ? modules[i].view(controllers[i]) : blank(), forceRedraw)
|
m.render(root, modules[i].view ? modules[i].view(controllers[i]) : blank())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//after rendering within a routed context, we need to scroll back to the top, and fetch the document title for history.pushState
|
//after rendering within a routed context, we need to scroll back to the top, and fetch the document title for history.pushState
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,19 @@ function testMithril(mock) {
|
||||||
|
|
||||||
return unloaded
|
return unloaded
|
||||||
})
|
})
|
||||||
|
test(function() {
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var module = {}, unloaded = false
|
||||||
|
module.controller = function() {
|
||||||
|
this.onunload = function() {unloaded = true}
|
||||||
|
}
|
||||||
|
module.view = function() {}
|
||||||
|
m.module(root, module)
|
||||||
|
m.module(root, {controller: function() {}, view: function() {}})
|
||||||
|
|
||||||
|
return unloaded === true
|
||||||
|
})
|
||||||
|
m.redraw.strategy(undefined) //teardown for m.module tests
|
||||||
|
|
||||||
//m.withAttr
|
//m.withAttr
|
||||||
test(function() {
|
test(function() {
|
||||||
|
|
@ -400,17 +413,6 @@ function testMithril(mock) {
|
||||||
var valueAfter = root.childNodes[0].style.background
|
var valueAfter = root.childNodes[0].style.background
|
||||||
return valueBefore === "red" && valueAfter === undefined
|
return valueBefore === "red" && valueAfter === undefined
|
||||||
})
|
})
|
||||||
test(function() {
|
|
||||||
var root = mock.document.createElement("div")
|
|
||||||
var module = {}, unloaded = false
|
|
||||||
module.controller = function() {
|
|
||||||
this.onunload = function() {unloaded = true}
|
|
||||||
}
|
|
||||||
module.view = function() {}
|
|
||||||
m.module(root, module)
|
|
||||||
m.module(root, {controller: function() {}, view: function() {}})
|
|
||||||
return unloaded === true
|
|
||||||
})
|
|
||||||
test(function() {
|
test(function() {
|
||||||
//https://github.com/lhorie/mithril.js/issues/87
|
//https://github.com/lhorie/mithril.js/issues/87
|
||||||
var root = mock.document.createElement("div")
|
var root = mock.document.createElement("div")
|
||||||
|
|
@ -490,7 +492,7 @@ function testMithril(mock) {
|
||||||
})
|
})
|
||||||
test(function() {
|
test(function() {
|
||||||
var root = mock.document.createElement("div")
|
var root = mock.document.createElement("div")
|
||||||
|
|
||||||
var success = false
|
var success = false
|
||||||
m.render(root, m("div", {config: function(elem, isInitialized, ctx) {ctx.data = 1}}))
|
m.render(root, m("div", {config: function(elem, isInitialized, ctx) {ctx.data = 1}}))
|
||||||
m.render(root, m("div", {config: function(elem, isInitialized, ctx) {success = ctx.data === 1}}))
|
m.render(root, m("div", {config: function(elem, isInitialized, ctx) {success = ctx.data === 1}}))
|
||||||
|
|
@ -1374,7 +1376,7 @@ function testMithril(mock) {
|
||||||
test(function() {
|
test(function() {
|
||||||
mock.requestAnimationFrame.$resolve() //setup
|
mock.requestAnimationFrame.$resolve() //setup
|
||||||
mock.location.search = "?"
|
mock.location.search = "?"
|
||||||
|
|
||||||
var root = mock.document.createElement("div")
|
var root = mock.document.createElement("div")
|
||||||
var unloaded = 0
|
var unloaded = 0
|
||||||
m.route.mode = "search"
|
m.route.mode = "search"
|
||||||
|
|
@ -1746,6 +1748,414 @@ function testMithril(mock) {
|
||||||
|
|
||||||
return mock.history.$$length == 0
|
return mock.history.$$length == 0
|
||||||
})
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = a.view
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = true
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
ctx.reuse = false
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 2
|
||||||
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var initCount = 0
|
||||||
|
|
||||||
|
var a = {}
|
||||||
|
a.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
a.view = function() {
|
||||||
|
return m("div", m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
var b = {}
|
||||||
|
b.controller = function() {m.redraw.strategy("diff")}
|
||||||
|
b.view = function() {
|
||||||
|
return m("section", m("a", {config: function(el, init, ctx) {
|
||||||
|
if (!init) initCount++
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route(root, "/a", {
|
||||||
|
"/a": a,
|
||||||
|
"/b": b,
|
||||||
|
})
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
m.route("/b")
|
||||||
|
|
||||||
|
mock.requestAnimationFrame.$resolve()
|
||||||
|
|
||||||
|
return initCount == 1
|
||||||
|
})
|
||||||
//end m.route
|
//end m.route
|
||||||
|
|
||||||
//m.prop
|
//m.prop
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue