fix onunload preventDefault in components
This commit is contained in:
parent
ad303427bf
commit
adf7b39650
1 changed files with 16 additions and 5 deletions
21
mithril.js
21
mithril.js
|
|
@ -502,11 +502,13 @@ var m = (function app(window, undefined) {
|
||||||
return gettersetter(store)
|
return gettersetter(store)
|
||||||
};
|
};
|
||||||
|
|
||||||
var roots = [], modules = [], controllers = [], lastRedrawId = null, lastRedrawCallTime = 0, computePostRedrawHook = null, prevented = false, topModule;
|
var roots = [], modules = [], controllers = [], lastRedrawId = null, lastRedrawCallTime = 0, computePostRedrawHook = null, prevented = false, topModule, unloaders = [];
|
||||||
var FRAME_BUDGET = 16; //60 frames per second = 1 call per 16 ms
|
var FRAME_BUDGET = 16; //60 frames per second = 1 call per 16 ms
|
||||||
function submodule(module, args) {
|
function submodule(module, args) {
|
||||||
var controller = function() {
|
var controller = function() {
|
||||||
return module.controller.apply(this, args) || this
|
var instance = module.controller.apply(this, args) || this
|
||||||
|
if (instance.onunload) unloaders.push({controller: instance, handler: instance.onunload})
|
||||||
|
return instance
|
||||||
}
|
}
|
||||||
var view = function(ctrl) {
|
var view = function(ctrl) {
|
||||||
if (arguments.length > 1) args = args.concat([].slice.call(arguments, 1))
|
if (arguments.length > 1) args = args.concat([].slice.call(arguments, 1))
|
||||||
|
|
@ -523,13 +525,22 @@ var m = (function app(window, undefined) {
|
||||||
if (root.controller) return submodule(root, [].slice.call(arguments, 1))
|
if (root.controller) return submodule(root, [].slice.call(arguments, 1))
|
||||||
var index = roots.indexOf(root);
|
var index = roots.indexOf(root);
|
||||||
if (index < 0) index = roots.length;
|
if (index < 0) index = roots.length;
|
||||||
|
|
||||||
var isPrevented = false;
|
var isPrevented = false;
|
||||||
|
var event = {preventDefault: function() {isPrevented = true}};
|
||||||
|
for (var i = 0, unloader; unloader = unloaders[i]; i++) {
|
||||||
|
unloader.handler(event)
|
||||||
|
unloader.controller.onunload = null
|
||||||
|
}
|
||||||
|
if (isPrevented) {
|
||||||
|
for (var i = 0, unloader; unloader = unloaders[i]; i++) unloader.controller.onunload = unloader.handler
|
||||||
|
}
|
||||||
|
else unloaders = []
|
||||||
|
|
||||||
if (controllers[index] && typeof controllers[index].onunload === FUNCTION) {
|
if (controllers[index] && typeof controllers[index].onunload === FUNCTION) {
|
||||||
var event = {
|
|
||||||
preventDefault: function() {isPrevented = true}
|
|
||||||
};
|
|
||||||
controllers[index].onunload(event)
|
controllers[index].onunload(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isPrevented) {
|
if (!isPrevented) {
|
||||||
m.redraw.strategy("all");
|
m.redraw.strategy("all");
|
||||||
m.startComputation();
|
m.startComputation();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue