Hi!
I have a parent template which calls a child template. I want to kill the child template by the press of a button.
Parent Template
<template name="tracker">
<span id="destroyChild" class="btn" title="destroyTable"></span>
{{<child}}
</template>
Then, I have an event to attempt and destroy the child template
‘click span[id=destroyChild]’(e, template) {
//This works to remove the Parent template
//Blaze.remove(template.view);
Blaze.remove('what do I put here?');
},
I can’t find anything to use as a param to remove the child template. I keep getting Uncaught Error: Expected template rendered with Blaze.render
.
I gave the child template an Id and tried calling this with a selector
but no luck. Any ideas? Thanks!
As per the documentation Blaze.remove
requires the view
object, but it only removes elements from the DOM rendered with Blaze.render
.
I created a quick test where I call Blaze.remove
on a template inserted with {{>child}}
. The onDestroyed callback is triggered but it stays visible in the DOM.
When I instead render the child template with Blaze.render
it will be removed from the DOM upon calling Blaze.remove
.
It would be much easier to handle this with reactivity, IMHO
1 Like
As @jamgold says, it would be better to handle this reactively.
Changing the way you code in Blaze from directively (“when x happens, do y to make it look like z”) to declaratively (“if x, it should look like z”) is hard at first, but when you grasp the principle
.
Conside a small change to your parent template:
<template name="tracker">
<span id="destroyChild" class="btn" title="destroyTable"></span>
{{#if showChild}}
{{>child}}
{{/if}}
</template>
Along with a reactive variable to control the display of the child:
Template.tracker.onCreated( function() {
this.childExists = new ReactiveVar(true);
});
An event handler to change the button state:
Template.tracker.events({
'click span#destroyChild'(event, templateInst) {
templateInst.childExists.set(false);
}
});
and a reactive helper:
Template.tracker.helpers({
showChild() {
return Template.instance().childExists.get();
}
});
Then you’ll have all the wiring needed for reactively destroying the child instance. Blaze will re-render that part of the DOM as if the child was never there.
1 Like