微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

twitter-bootstrap – Twitter Bootstrap预先选择未受KnockoutJS约束

好吧,我已经和这个问题打了几个小时了,并把问题缩小到一个非常简单的 Fiddle

问题是,当我在文本输入上使用twitter bootstrap的typeahead插件并进行选择时,该值不会在KnockoutJS viewmodel中更新.我知道我可以破解它的工作,但必须有一些我在这里缺少的东西.

基本上我所拥有的是:

淘汰赛绑定

// Bind twitter typeahead
ko.bindingHandlers.typeahead = {
    init: function (element,valueAccessor,allBindingsAccessor,viewmodel,bindingContext) {
        var $element = $(element);
        var allBindings = allBindingsAccessor();
        var typeaheadArr = ko.utils.unwrapObservable(valueAccessor());

        $element.attr("autocomplete","off")
                .typeahead({
                    'source': typeaheadArr,'minLength': allBindings.minLength,'items': allBindings.items,'updater': allBindings.updater
                });
    }
};

淘汰viewmodel

function MyModel(){
    var self = this;
    self.productName = ko.observable();
    self.availableProducts = ['One','Two','Three'];
}

ko.applyBindings(new MyModel());

HTML

<input type="text" data-bind="typeahead:availableProducts,value:productName"/>

其余的东西只是来自Twitter Bootstrap.

解决方法

一种解决方案是修改updater函数,您需要获取值绑定中使用的observable并使用函数参数更新它:
'updater': function(item) {
    allBindings.value(item);
    return item;
}

演示JSFiddle.

如果您不是绑定的作者,则可以使用updater选项指定更新程序功能

data-bind="typeahead:availableProducts,updater: function(item) { productName(item); return item; }"

因为更新程序应返回所选项目,所以这种语法不太好.

演示JSFiddle.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐