I am trying to create a custom binding for twitter tooltips that reference a template, but I am having problems with the connecting part of the content inside the popover after creating it.
I already asked this question, but I feel that they are mostly pretty dirty, and I'm pretty close to a reusable solution that uses templates the way I want.
http://jsfiddle.net/billpull/Edptd/
// Bind Twitter Popover ko.bindingHandlers.popover = { init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var tmplId = ko.utils.unwrapObservable(valueAccessor()); var tmplHtml = $('#' + tmplId).html(); var uuid = guid(); var domId = "ko-bs-popover-" + uuid; var tmplDom = $('<div/>', { "class" : "ko-popover", "id" : domId }).html(tmplHtml); options = { content: tmplDom[0].outerHTML }; var popoverOptions = ko.utils.extend(ko.bindingHandlers.popover.options, options); console.log($(element)); console.log(element); $(element).bind('click', function () { $(this).popover(popoverOptions).popover('toggle'); ko.applyBindings(bindingContext, document.getElementById(domId)); }); }, options: { placement: "right", title: "", html: true, content: "", trigger: "manual" } };
=== EDIT
Updated code based on the answer below that allows you to do this without additional toProperties binding
// Bind Twitter Popover ko.bindingHandlers.popover = { init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { // read popover options var popoverBindingValues = ko.utils.unwrapObservable(valueAccessor()); // set popover template id var tmplId = popoverBindingValues.template; // set popover trigger var trigger = popoverBindingValues.trigger; // get template html var tmplHtml = $('#' + tmplId).html(); // create unique identifier to bind to var uuid = guid(); var domId = "ko-bs-popover-" + uuid; // create correct binding context var childBindingContext = bindingContext.createChildContext(viewModel); // create DOM object to use for popover content var tmplDom = $('<div/>', { "class" : "ko-popover", "id" : domId }).html(tmplHtml); // set content options options = { content: tmplDom[0].outerHTML }; // Need to copy this, otherwise all the popups end up with the value of the last item var popoverOptions = $.extend({}, ko.bindingHandlers.popover.options); popoverOptions.content = options.content; // bind popover to element click $(element).bind(trigger, function () { $(this).popover(popoverOptions).popover('toggle'); // if the popover is visible bind the view model to our dom ID if($('#' + domId).is(':visible')){ ko.applyBindingsToDescendants(childBindingContext, $('#' + domId)[0]); } }); return { controlsDescendantBindings: true }; }, options: { placement: "right", title: "", html: true, content: "", trigger: "manual" } };