prevent route change event if only hash changes
This commit is contained in:
parent
5b98b9b190
commit
1d2ba8b0b0
2 changed files with 33 additions and 10 deletions
17
mithril.js
17
mithril.js
|
|
@ -53,11 +53,15 @@ Mithril = m = new function app(window) {
|
||||||
cached[cacheCount++] = item
|
cached[cacheCount++] = item
|
||||||
}
|
}
|
||||||
if (!intact) {
|
if (!intact) {
|
||||||
for (var i = 0; i < data.length; i++) if (cached[i] !== undefined) nodes = nodes.concat(cached[i].nodes)
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
if (cached[i] !== undefined) nodes = nodes.concat(cached[i].nodes)
|
||||||
|
}
|
||||||
for (var i = nodes.length, node; node = cached.nodes[i]; i++) {
|
for (var i = nodes.length, node; node = cached.nodes[i]; i++) {
|
||||||
if (node.parentNode !== null && node.parentNode.childNodes.length != nodes.length) node.parentNode.removeChild(node)
|
if (node.parentNode !== null && node.parentNode.childNodes.length != nodes.length) node.parentNode.removeChild(node)
|
||||||
}
|
}
|
||||||
for (var i = cached.nodes.length, node; node = nodes[i]; i++) if (node.parentNode === null) parentElement.appendChild(node)
|
for (var i = cached.nodes.length, node; node = nodes[i]; i++) {
|
||||||
|
if (node.parentNode === null) parentElement.appendChild(node)
|
||||||
|
}
|
||||||
if (data.length < cached.length) cached.length = data.length
|
if (data.length < cached.length) cached.length = data.length
|
||||||
cached.nodes = nodes
|
cached.nodes = nodes
|
||||||
}
|
}
|
||||||
|
|
@ -274,20 +278,22 @@ Mithril = m = new function app(window) {
|
||||||
m.route = function() {
|
m.route = function() {
|
||||||
if (arguments.length === 0) return currentRoute
|
if (arguments.length === 0) return currentRoute
|
||||||
else if (arguments.length === 3) {
|
else if (arguments.length === 3) {
|
||||||
currentRoute = window.location[m.route.mode].slice(modes[m.route.mode].length)
|
|
||||||
var root = arguments[0], defaultRoute = arguments[1], router = arguments[2]
|
var root = arguments[0], defaultRoute = arguments[1], router = arguments[2]
|
||||||
redirect = function(source) {
|
redirect = function(source) {
|
||||||
var path = currentRoute = source.slice(modes[m.route.mode].length)
|
var path = currentRoute = normalizeRoute(source)
|
||||||
if (!routeByValue(root, router, path)) {
|
if (!routeByValue(root, router, path)) {
|
||||||
m.route(defaultRoute, true)
|
m.route(defaultRoute, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var listener = m.route.mode == "hash" ? "onhashchange" : "onpopstate"
|
var listener = m.route.mode == "hash" ? "onhashchange" : "onpopstate"
|
||||||
window[listener] = function() {
|
window[listener] = function() {
|
||||||
redirect(window.location[m.route.mode])
|
if (currentRoute != normalizeRoute(window.location[m.route.mode])) {
|
||||||
|
redirect(window.location[m.route.mode])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
computePostRedrawHook = scrollToHash
|
computePostRedrawHook = scrollToHash
|
||||||
window[listener]()
|
window[listener]()
|
||||||
|
currentRoute = normalizeRoute(window.location[m.route.mode])
|
||||||
}
|
}
|
||||||
else if (arguments[0].addEventListener) {
|
else if (arguments[0].addEventListener) {
|
||||||
var element = arguments[0]
|
var element = arguments[0]
|
||||||
|
|
@ -319,6 +325,7 @@ Mithril = m = new function app(window) {
|
||||||
}
|
}
|
||||||
m.route.param = function(key) {return routeParams[key]}
|
m.route.param = function(key) {return routeParams[key]}
|
||||||
m.route.mode = "search"
|
m.route.mode = "search"
|
||||||
|
function normalizeRoute(route) {return route.slice(modes[m.route.mode].length)}
|
||||||
function routeByValue(root, router, path) {
|
function routeByValue(root, router, path) {
|
||||||
routeParams = {}
|
routeParams = {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -616,8 +616,8 @@ function testMithril(mock) {
|
||||||
var root = mock.document.createElement("div")
|
var root = mock.document.createElement("div")
|
||||||
m.route.mode = "search"
|
m.route.mode = "search"
|
||||||
m.route(root, "/", {
|
m.route(root, "/", {
|
||||||
"/": {controller: function() {}, view: function() {return;}},
|
"/": {controller: function() {}, view: function() {}},
|
||||||
"/test12": {controller: function() {}, view: function() {return;}}
|
"/test12": {controller: function() {}, view: function() {}}
|
||||||
})
|
})
|
||||||
mock.performance.$elapse(50)
|
mock.performance.$elapse(50)
|
||||||
m.route("/test12?a=foo&b=bar")
|
m.route("/test12?a=foo&b=bar")
|
||||||
|
|
@ -647,7 +647,7 @@ function testMithril(mock) {
|
||||||
m.route.mode = "search"
|
m.route.mode = "search"
|
||||||
m.route(root, "/", {
|
m.route(root, "/", {
|
||||||
"/": {controller: function() {}, view: function() {return "bar"}},
|
"/": {controller: function() {}, view: function() {return "bar"}},
|
||||||
"/test14": {controller: function() {}, view: function() {return "foo" }}
|
"/test14": {controller: function() {}, view: function() {return "foo"}}
|
||||||
})
|
})
|
||||||
mock.performance.$elapse(50)
|
mock.performance.$elapse(50)
|
||||||
m.route("/test14?test&test2=")
|
m.route("/test14?test&test2=")
|
||||||
|
|
@ -661,14 +661,30 @@ function testMithril(mock) {
|
||||||
var root = mock.document.createElement("div")
|
var root = mock.document.createElement("div")
|
||||||
m.route.mode = "search"
|
m.route.mode = "search"
|
||||||
m.route(root, "/", {
|
m.route(root, "/", {
|
||||||
"/": {controller: function() {}, view: function() {return;}},
|
"/": {controller: function() {}, view: function() {}},
|
||||||
"/test12": {controller: function() {}, view: function() {return;}}
|
"/test12": {controller: function() {}, view: function() {}}
|
||||||
})
|
})
|
||||||
mock.performance.$elapse(50)
|
mock.performance.$elapse(50)
|
||||||
m.route("/test12", {a: "foo", b: "bar"})
|
m.route("/test12", {a: "foo", b: "bar"})
|
||||||
mock.performance.$elapse(50) //teardown
|
mock.performance.$elapse(50) //teardown
|
||||||
return mock.location.search == "?/test12?a=foo&b=bar" && m.route.param("a") == "foo" && m.route.param("b") == "bar"
|
return mock.location.search == "?/test12?a=foo&b=bar" && m.route.param("a") == "foo" && m.route.param("b") == "bar"
|
||||||
})
|
})
|
||||||
|
test(function() {
|
||||||
|
mock.performance.$elapse(50) //setup
|
||||||
|
mock.location.search = "?"
|
||||||
|
|
||||||
|
var root = mock.document.createElement("div")
|
||||||
|
var route1, route2
|
||||||
|
m.route.mode = "search"
|
||||||
|
m.route(root, "/", {
|
||||||
|
"/": {controller: function() {route1 = m.route()}, view: function() {}},
|
||||||
|
"/test13": {controller: function() {route2 = m.route()}, view: function() {}}
|
||||||
|
})
|
||||||
|
mock.performance.$elapse(50)
|
||||||
|
m.route("/test13")
|
||||||
|
mock.performance.$elapse(50) //teardown
|
||||||
|
return route1 == "/" && route2 == "/test13"
|
||||||
|
})
|
||||||
//end m.route
|
//end m.route
|
||||||
|
|
||||||
//m.prop
|
//m.prop
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue