diff --git a/mithril.js b/mithril.js index 080c60525..eaf8a782c 100644 --- a/mithril.js +++ b/mithril.js @@ -460,7 +460,17 @@ var m = (function app(window, undefined) { return data; } - function buildObject(data, cached, editable, parentElement, index, shouldReattach, namespace, configs) { + function makeRedrawSelf(controller, view, parentElement, parentTag, parentCache, parentIndex, newData, cached, shouldReattach, index, editable, namespace, configs) { + return function() { + configs = []; + m.redraw.strategy('none'); + var newData = view(controller); + build(parentElement, parentTag, parentCache, parentIndex, newData, cached, shouldReattach, index, editable, namespace, configs); + forEach(configs, function (config) { config(); }); + } + } + + function buildObject(parentElement, parentTag, parentCache, parentIndex, data, cached, shouldReattach, index, editable, namespace, configs) { var views = [], controllers = []; data = markViews(data, cached, views, controllers); if (!data.tag && controllers.length) throw new Error("Component template must return a virtual element, not an array, string, etc."); @@ -487,6 +497,15 @@ var m = (function app(window, undefined) { //schedule configs to be called. They are called after `build` //finishes running scheduleConfigsToBeCalled(configs, data, node, isNew, cached); + + // Single component redraw fix + for (var i = 0; i < controllers.length; i++) { + var controller = controllers[i]; + if (isFunction(controller.redrawSelf)) { + controller.redrawSelf = makeRedrawSelf(controller, views[i], parentElement, parentTag, parentCache, parentIndex, data, cached, shouldReattach, index, editable, namespace, []); + } + } + return cached } @@ -544,7 +563,7 @@ var m = (function app(window, undefined) { if (data.subtree === "retain") return cached; cached = makeCache(data, cached, index, parentIndex, parentCache); return isArray(data) ? buildArray(data, cached, parentElement, index, parentTag, shouldReattach, editable, namespace, configs) : - data != null && isObject(data) ? buildObject(data, cached, editable, parentElement, index, shouldReattach, namespace, configs) : + data != null && isObject(data) ? buildObject(parentElement, parentTag, parentCache, parentIndex, data, cached, shouldReattach, index, editable, namespace, configs) : !isFunction(data) ? handleText(cached, data, index, parentElement, shouldReattach, editable, parentTag) : cached; }