Search code examples
javascriptknockout.jsbootstrap-tour

Knockout.js + Bootstrap Tour


I would like to use Knockout.js with Bootstrap Tour. In particular, I would like to attach some data bound click handler to a button within a tour step.

I create a simple tour like this:

var tour = new new Tour({
    steps: [
        {
            orphan: true,
            title: "Help Title",
            content: "<button data-bind='click: someBoundFunction'>Click me!</button>"
        }
    ]
});
tour.init();
tour.start(true);

Is it possible to use this kind of binding? Or won't this binding work because of the markup code creation mechanism of bootstraptour? I tried it like this but clicking on the button does not execute the function neither is any error message shown.


Solution

  • Knockout doesn't update bindings automatically for newly added elements. There is a workaround though, see this question (and related). Below is a possible solution based on this workaround.

    So you have a main view model, which starts your tour:

    function ViewModel(){
        var self = this;
        this.tour = new Tour({ 
            steps: [
                {
                    orphan: true,
                    title: "Help Title",
                    content: '<button id="newButton" data-bind="click: showMessage">showMessage</button>',
                    onShown: function(tour) {
                        // apply the bindings after content is added
                        ko.applyBindings(self, document.getElementById("newButton"));
                    }
                }
            ]
        });
        this.startTour = function() {
            this.tour.init();        
            self.tour.start(true);        
        }
        this.showMessage = function() {
            alert('Hello!');
        }
    }
    

    Working demo.