From 8b2c642df1d3d7e348afd20e4656152fe79ed907 Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Wed, 1 Apr 2015 15:36:04 -0700 Subject: [PATCH] Fix #4097: error when View invalidated immediately Bug introduced in 28c760e --- packages/blaze/view.js | 4 +++- packages/spacebars-tests/template_tests.html | 4 ++++ packages/spacebars-tests/template_tests.js | 24 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/blaze/view.js b/packages/blaze/view.js index b5c105c6e9..63d32083de 100644 --- a/packages/blaze/view.js +++ b/packages/blaze/view.js @@ -354,7 +354,9 @@ Blaze._materializeView = function (view, parentView, _workStack, _intoArray) { // helpers in the DOM tree to be replaced might be scheduled // to re-run before we have a chance to stop them. Tracker.onInvalidate(function () { - domrange.destroyMembers(); + if (domrange) { + domrange.destroyMembers(); + } }); }, undefined, 'materialize'); diff --git a/packages/spacebars-tests/template_tests.html b/packages/spacebars-tests/template_tests.html index 6ff3a5582a..d5260e05c1 100644 --- a/packages/spacebars-tests/template_tests.html +++ b/packages/spacebars-tests/template_tests.html @@ -32,6 +32,10 @@ {{/if}} + + diff --git a/packages/spacebars-tests/template_tests.js b/packages/spacebars-tests/template_tests.js index b68a491bc0..436ba072e8 100644 --- a/packages/spacebars-tests/template_tests.js +++ b/packages/spacebars-tests/template_tests.js @@ -2749,6 +2749,30 @@ Tinytest.add('spacebars-tests - template_tests - current view in event handler', }); +Tinytest.add('spacebars-tests - template_tests - helper invalidates self', function (test) { + var tmpl = Template.spacebars_template_test_bracketed_foo; + + var count = new ReactiveVar(0); + + tmpl.helpers({ + // It's unusual for a helper to have side effects, but it's possible + // and people do it. Regression test for #4097. + foo: function () { + // Make count odd and return it. + var c = count.get(); + if ((c % 2) === 0) { + count.set(c+1); + } + return c; + } + }); + + var div = renderToDiv(tmpl); + divRendersTo(test, div, '[1]'); + count.set(2); + divRendersTo(test, div, '[3]'); +}); + Tinytest.add( "spacebars-tests - template_tests - textarea attrs", function (test) { var tmplNoContents = {