Deduplicate m.route and m.redraw logic (#2453)
- Remove appropriate route change subcriptions when a root is removed via `m.mount(root, null)`. - Don't pollute `onpopstate` and friends - use standard event listeners instead. - Simplify and streamline subscriptions, in preparation of adding a `remove` parameter to `m.mount`. - Change the redraw internals to redraw immediately, with ability to cancel via returning a sentinel. - Change `"bleeding-edge"` for `m.version` in `next` to instead just be the latest `m.version`. (If you're using `next`, you should know what you're in for.) - Update tests to be aware of these changes. (Some were failing for subtle reasons.) - Drive-by: remove some uses of `string.charAt(n)` and use `string[n]` instead.
This commit is contained in:
parent
6c562d2b9b
commit
90bcff0fa7
18 changed files with 397 additions and 192 deletions
|
|
@ -14,24 +14,40 @@ function throttle(callback) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = function($window, throttleMock) {
|
||||
var renderService = coreRenderer($window)
|
||||
var callbacks = []
|
||||
var subscriptions = []
|
||||
var rendering = false
|
||||
|
||||
function subscribe(key, callback) {
|
||||
function run(sub) {
|
||||
var vnode = sub.c(sub)
|
||||
if (vnode !== sub) renderService.render(sub.k, vnode)
|
||||
}
|
||||
function subscribe(key, callback, onremove) {
|
||||
var sub = {k: key, c: callback, r: onremove}
|
||||
unsubscribe(key)
|
||||
callbacks.push(key, callback)
|
||||
subscriptions.push(sub)
|
||||
var vnode = sub.c(sub)
|
||||
if (vnode !== sub) renderService.render(sub.k, vnode)
|
||||
}
|
||||
function unsubscribe(key) {
|
||||
var index = callbacks.indexOf(key)
|
||||
if (index > -1) callbacks.splice(index, 2)
|
||||
for (var i = 0; i < subscriptions.length; i++) {
|
||||
var sub = subscriptions[i]
|
||||
if (sub.k === key) {
|
||||
subscriptions.splice(i, 1)
|
||||
renderService.render(sub.k, [])
|
||||
if (typeof sub.r === "function") sub.r()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
function sync() {
|
||||
if (rendering) throw new Error("Nested m.redraw.sync() call")
|
||||
rendering = true
|
||||
for (var i = 1; i < callbacks.length; i+=2) try {callbacks[i]()} catch (e) {if (typeof console !== "undefined") console.error(e)}
|
||||
for (var i = 0; i < subscriptions.length; i++) {
|
||||
try { run(subscriptions[i]) }
|
||||
catch (e) { if (typeof console !== "undefined") console.error(e) }
|
||||
}
|
||||
rendering = false
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue