【问题标题】:Not able to select / bind item from jquery autocomplete using Knockout JS无法使用 Knockout JS 从 jquery 自动完成中选择/绑定项目
【发布时间】:2014-07-05 20:47:52
【问题描述】:

在我终于能够在列表中添加和删除项目 (see fiddle) 之后,我开始实施 jQuery 自动完成功能。

查看Rune's exampleRene's example 后,我能够触发自动完成。但是当我选择一个项目时,这些值不会添加到我的隐藏输入和搜索框中。

我当前的解决方案遵循 Rune 的示例,但一旦我能够绑定所选项目,我可能会简化它并遵循 Rene 的示例。

所以我的问题是:如何绑定所选项目? I've created a Fiddle 进行测试。

PS。将搜索数据放入数组(而不是从数据库中获取)时,我在小提琴中遇到问题。但这不是我的主要问题。

这是关于自动完成的部分代码:

我的 HTML:

<input type="hidden" value="" data-bind="value: item_id" />
<input class="form-control" type="search" data-bind="value: item_name, autoComplete: items" />     
...
<ul class="list-group" data-bind="template: { name: 'item-template', data: $root.items}">
...
</ul>

我的JS;

// Retrieved from DB
var search_data = [
    {"id":"7186","name":"Bose"},
    {"id":"1069","name":"BOSS Black"},
    {"id":"1070","name":"BOSS Green"},
    {"id":"1071","name":"BOSS Hugo Boss"},
    {"id":"1072","name":"BOSS Orange"},
    {"id":"1074","name":"Boston Brothers"},
    {"id":"7678","name":"Bosweel"}
];

ko.bindingHandlers.autoComplete = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var selectedObservableArrayInViewModel = valueAccessor();
        var self = bindingContext;
        self.item_id = ko.observable();
        self.item_name = ko.observable();    

        $(element).autocomplete({
            minLength: 2,
            source: function (request, response) {
                $.ajax({
                    source: search_data,
                    data: { term: request.term },
                    type: "POST",
                    dataType: "json",
                    success: function (data) {
                        response(data);
                    }
                });
            },
            select: function(e, ui){
                var item = ui.item;
                self.item_name = ko.observable(item.name);
                self.item_id = ko.observable(item.id);
            }
        }).data( "uiAutocomplete" )._renderItem = function( ul, item ) {
            return jQuery( "<li></li>" )
            .data( "ui-autocomplete", item )
            .append( "<a>"+ item.name + "</a>" )
            .appendTo( ul );
        }

    }
};

【问题讨论】:

    标签: jquery jquery-ui knockout.js autocomplete


    【解决方案1】:

    我不确定我是否理解你的问题,所以我不确定这是否能回答。

    首先,你需要替换这个

    var self = bindingContext;
    

    有了这个

    var self = viewModel;
    

    然后,在您的 select 函数中,不要重新创建您的 observables,更新它们然后调用您的 addItem 函数:

    select: function(e, ui){
                var item = ui.item;
                self.item_name(item.name);
                self.item_id(item.id);
                self.addItem();
            }
    

    更新了fiddle(我删除了您的 ajax 调用以显示所有项目而不过滤,仅用于演示 - ajax 调用失败)

    编辑:

    在前面的fiddle中,输入是在选中一个item之后清空的。

    return false; 添加到select 函数的末尾以避免这种情况。

    fiddle

    【讨论】:

    • 效果很好,谢谢!就一件事。如果我删除了self.addItem(),为什么我的选择没有显示在搜索框中?
    • @Steven 你叫什么搜索框?是找到的物品清单吗?找到的项目填充有对response 函数的调用。 select 函数在您单击找到的项目之一时被调用,这是您需要将项目添加到 items observableArray 的地方。
    • 没错。所以当我点击它时,我想在搜索框中看到这个名字。搜索框是&lt;input class="form-control"... 输入。目前,未显示名称,但单击 Add 会将我的选择添加到列表中。我也必须使用$('.form-control').val(item.name)吗?
    • @Steven 回答已更新。通常是return false 以避免进一步的操作
    • 然后瞧。非常感谢。你让我开心:)
    猜你喜欢
    • 2012-02-09
    • 2015-01-01
    • 2011-09-05
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多