diff --git a/packages/blaze/component.js b/packages/blaze/component.js index 70c622e6f3..753f15eafb 100644 --- a/packages/blaze/component.js +++ b/packages/blaze/component.js @@ -67,7 +67,10 @@ Blaze.Component = Blaze.Controller.extend({ return self.render(); }); range.onstop(function () { - self.finalize(); + if (! self.isFinalized) { + self.isFinalized = true; + self.finalize(); + } }); return range; }, diff --git a/packages/blaze/domrange.js b/packages/blaze/domrange.js index 981962cdd6..45bf69bfbd 100644 --- a/packages/blaze/domrange.js +++ b/packages/blaze/domrange.js @@ -1,3 +1,4 @@ + // A constant empty array (frozen if the JS engine supports it). var _emptyArray = Object.freeze ? Object.freeze([]) : []; @@ -286,19 +287,18 @@ _.extend(Blaze.DOMRange.prototype, { } }); -Blaze.DOMAugmenter = function () {}; +Blaze.DOMAugmenter = JSClass.create(); _.extend(Blaze.DOMAugmenter, { attach: function (range, element) {}, // arguments are same as were passed to `attach` detach: function (range, element) {} }); -Blaze.EventAugmenter = function (eventMap) { - this.eventMap = eventMap; - this.handles = []; -}; -Blaze.EventAugmenter.prototype = new Blaze.DOMAugmenter; -_.extend(Blaze.EventAugmenter.prototype, { +Blaze.EventAugmenter = Blaze.DOMAugmenter.extend({ + constructor: function (eventMap) { + this.eventMap = eventMap; + this.handles = []; + }, attach: function (range, element) { var self = this; var eventMap = self.eventMap; diff --git a/packages/ui/newblaze.js b/packages/ui/newblaze.js index 427d55d740..9862459978 100644 --- a/packages/ui/newblaze.js +++ b/packages/ui/newblaze.js @@ -11,6 +11,28 @@ _.extend(UI.body2, { } }); +if (Meteor.isClient) { + UI.TemplateRenderedAugmenter = Blaze.DOMAugmenter.extend({ + constructor: function () { + this.fired = false; + }, + attach: function (range, element) { + if (! this.fired) { + this.fired = true; // only fire once + var tmpl = range.controller; + if (tmpl.rendered && ! tmpl.isFinalized) { + Deps.afterFlush(function () { + if (! tmpl.isFinalized) { + var templateInstance = {}; // XXX + tmpl.rendered.call(templateInstance); + } + }); + } + } + } + }); +} + UI.TemplateComponent = Blaze.Component.extend({ constructor: function (dataFunc, contentFunc, elseFunc) { UI.TemplateComponent.__super__.constructor.call(this); @@ -40,6 +62,9 @@ UI.TemplateComponent = Blaze.Component.extend({ range.addDOMAugmenter(new Blaze.EventAugmenter(m)); }); } + if (this.rendered) { + range.addDOMAugmenter(new UI.TemplateRenderedAugmenter); + } return range; }, events: function (eventMap) {