JSFiddle - React, Tailwind, and code Playground

by rniemeyer

HTML

<link rel="stylesheet" href="http:////netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://rawgithub.com/jharding/typeahead.js-bootstrap.css/master/typeahead.js-bootstrap.css">
<script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.debug.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.9.3/typeahead.min.js"></script>
<form role="form">
    <div class="row">
        <div class="col-sm-4 form-group">
            <input type="text" class="form-control" data-bind="typeahead: { name: 'sectionNames', local: options }, value: name" />
        </div>
    </div>
    <div data-bind="foreach: sections">
        <div class="row">
            <div class="col-sm-4 form-group">
                <input type="text" class="form-control" data-bind="typeahead: { name: 'sectionNames', local: $parent.options }, value: name" />  
            </div>
        </div>
    </div>
</form>


<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>

JavaScript

ko.bindingHandlers.typeahead = {
    init: function(element, valueAccessor) {
        var options = ko.unwrap(valueAccessor()) || {},
            $el = $(element),
            triggerChange = function() {
                $el.change();   
            }
        
        $el.typeahead(options)
            .on("typeahead:selected", triggerChange)
            .on("typeahead:autocompleted", triggerChange);        
        
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $el.typeahead("destroy"); 
            $el = null;
        }); 
    }
};

ko.applyBindings({
    options: [
        "one",
        "two",
        "three",
        "four"
    ],
    
    name: ko.observable(),
    
    sections: [
        { name: ko.observable(), other: "1234" },
        { name: ko.observable(), other: "5678" }
    ]
});