Typeahead.js не работает в Knockout 3 foreach binding
Я обновил веб-приложение до Bootstrap 3 и Knockout 3 и, следовательно, потерял встроенный typeahead, который был в Bootstrap 2. Я добавил typeahead.js, и он отлично работает, если у меня нет typeahead в привязке Knockout 'foreach'. Я включил код, который работает и не работает ниже, а также код Javascript для привязки typeahead и Bootstrap. Любые идеи?
<form role="form">
<div class="row">
<div class="col-sm-4 form-group">
<input type="text" class="form-control sectionNames" data-bind="value: name" />
</div>
</div>
<div data-bind="foreach: section">
<div class="row">
<div class="col-sm-4 form-group">
<input type="text" class="form-control sectionNames" data-bind="value: name" />
</div>
</div>
</div>
</form>
Javascript для привязок типаahead.js и Knockout
<script>
$( document ).ready(function() {
$('input.sections').typeahead({
name: 'sectionName',
local: [
'ABC',
'DEF'
]
});
ko.applyBindings({
section : [
{ name: "", other: "1234" },
{ name: "", other: "5678" }
]
});
});
</script>
Ответы
Ответ 1
Лучше всего сделать что-то вроде виджета, особенно когда вы выполняете рендеринг элементов с помощью шаблонов/управления потоком, - это использовать настраиваемую привязку для инициализации виджета. Например, вы можете использовать что-то вроде этого:
ko.bindingHandlers.typeahead = {
init: function(element, valueAccessor) {
var options = ko.unwrap(valueAccessor()) || {},
$el = $(element),
triggerChange = function() {
$el.change();
}
//initialize widget and ensure that change event is triggered when updated
$el.typeahead(options)
.on("typeahead:selected", triggerChange)
.on("typeahead:autocompleted", triggerChange);
//if KO removes the element via templating, then destroy the typeahead
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$el.typeahead("destroy");
$el = null;
});
}
};
Вот пример: http://jsfiddle.net/rniemeyer/uuvUR/
Ответ 2
Вы должны просто переопределить события, которые отвечают за значениеUpdate в KO
<input type="text"
class="form-control sectionNames"
data-bind="
value: name,
valueUpdate: 'typeahead:selected typeahead:autocompleted"
/>