I have a modal popup with similar data and need the bindings cleared. The answer for the highest rating says to use knockout's clean node method
Here are (handwritten) code snippets:
var ViewModel = function(v) {
var self = this;
self.Foo = ko.observable(v.Foo);
self.Bar = ko.observable(v.Bar);
self.Stuffs = ko.observableArray([]);
self.AddStuffs = function() { ... }
}
var myViewModel = new ViewModel({Foo : "", Bar: "" });
var myModal= document.getElementById("myModal");
ko.cleanNode(myModal);
ko.applyBindings(myViewModel, myModal);
html:
<div id="myModal">
<a href="#" data-bind="click:$root.AddStuff">my link</a>
<table>
<tbody data-bind="foreach:Stuffs ">
<tr>
<td><span data-bind="text:Interval"></span></td>
</tr>
</tbody>
</table>
</div>
When I first open the modal, everything seems to work okay. But this answer says cleanNode is the incorrect solution due to cleanNode being knockout's internal cleanup. It doesn't clean up event handlers, so when my modal is closed and opened again and I click the link for AddStuff, the event gets called n times (n = how many times I opened the popup). The proposed solution mentioned was "A better pattern is to use with or the template binding around a section and allow it to be re-rendered with the new bindings." but there was no followup on how to do either.
I'm not sure what he means by "template" but I tried adding "with" to bind my div that I use for the modal and events are still being called multiple times on one link click. Can someone help me find a way to get this working right?