Twitter Bootstrap Typeahead - ID和标签

Pie*_*NAY 45 javascript jquery autocomplete twitter-bootstrap typeahead.js

我正在使用Bootstrap 2.1.1和jQuery 1.8.1并尝试使用Typeahead的功能.

我尝试显示标签并使用像标准的ID<select />

这是我的预先初始化:

$(':input.autocomplete').typeahead({
    source: function (query, process) {
        $('#autocompleteForm .query').val(query);
        return $.get(
            $('#autocompleteForm').attr('action')
          , $('#autocompleteForm').serialize()
          , function (data) {
              return process(data);
          }
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

这是我发送的那种JSON

[{"id":1,"label":"machin"},{"id":2,"label":"truc"}]
Run Code Online (Sandbox Code Playgroud)

如何process()显示我的标签并将所选ID存储在另一个隐藏字段中?

Ger*_*bus 79

这里有一个很好的教程解释了如何执行此操作:http://tatiyants.com/how-to-use-json-objects-with-twitter-bootstrap-typeahead/(如果没有,请阅读我对该页面的评论已经反映在帖子的主要部分).

根据该教程和您提供的JSON,您可以执行以下操作:

$(':input.autocomplete').typeahead({
    source: function(query, process) {
        objects = [];
        map = {};
        var data = [{"id":1,"label":"machin"},{"id":2,"label":"truc"}] // Or get your JSON dynamically and load it into this variable
        $.each(data, function(i, object) {
            map[object.label] = object;
            objects.push(object.label);
        });
        process(objects);
    },
    updater: function(item) {
        $('hiddenInputElement').val(map[item].id);
        return item;
    }
});                    
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一件重要事情是`map`变量及其范围.根据你的代码,它与`objects`变量一起是全局的.这意味着您一次只能在页面上有1个预先输入,否则地图对象将在预先输入框之间共享并导致奇怪的错误.要使多个类型成为头,您需要使用闭包并在那里定义map变量. (15认同)
  • "对象的名称必须是唯一的才能使其正常工作." 因此,如果您过滤可能具有相同名称的人员列表,则他们的解决方案不起作用. (8认同)
  • @MarcelBurkhard你可以在下拉项中有其他元素来识别条目,例如基于id的facebook图片. (4认同)

Joh*_*ika 14

从Twitter Typeahead(https://github.com/twitter/typeahead.js)版本0.10.1开始,本机支持Id/Label:

  $('input[name=address]').typeahead({
        hint: false
    }, {
        source: function (query, cb) {
            $.ajax({
                url: '/api/addresses?q=' + encodeURIComponent(query),
                dataType: 'json',
                cache: false,
                type: 'GET',
                success: function (response, textStatus, jqXHR) {
                    cb(response.data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                }
            });
        },
        name: 'addresses',
        displayKey: 'text'
    }).on('typeahead:selected', function (e, suggestion, name) {
        window.location.href = '/' + suggestion.id;
    });
Run Code Online (Sandbox Code Playgroud)

如果上面的例子,我将一个对象数组传递给源回调(cb).通过指定displayKey:'text',我告诉库使用'text'属性进行自动建议.当调用'typeahead:select'回调时,传入的第二个参数(suggestion)包含所选的对象.


Mic*_*aev 6

澄清我在评论中说的话.如果您希望在同一页面上有多个类型前置,则需要在函数中定义每个类型,并为它们创建单独的映射变量.

function initFromField() {
    var map;
    $('#from:input.autocomplete').typeahead({
        source: function(query, process) {
            map = {};
            var data = [{"id":1,"label":"machin"},{"id":2,"label":"truc"}] // Or get your JSON dynamically and load it into this variable
            objects = constructMap(data, map);
            process(objects);
        },
        updater: function(item) {
            $('#hidden-from-input').val(map[item].id);
            return item;
        }
    });
}

function initToField() {
    var map;
    $('#to:input.autocomplete').typeahead({
        source: function(query, process) {
            objects = [];
            map = {};
            var data = [{"id":1,"label":"machin"},{"id":2,"label":"truc"}] // Or get your JSON dynamically and load it into this variable
            objects = constructMap(data, map);
            process(objects);
        },
        updater: function(item) {
            $('#hidden-to-input').val(map[item].id);
            return item;
        }
    });
}

function constructMap(data, map) {
    var objects = [];
    $.each(data, function(i, object) {
        map[object.label] = object;
        objects.push(object.label);
    });
    return objects;
}

$(function initFields() {
    initFromField();
    initToField();
});
Run Code Online (Sandbox Code Playgroud)

请注意我如何在两个字段初始化函数中限定map变量.这很重要,它确保两个输入字段都不使用相同的映射变量.


Hen*_*nyH 5

我自己一直在努力解决这个问题,这是我想出的解决方案,适用于以下类型的数据:

[{'id':an_id, 'name':a_name}]
Run Code Online (Sandbox Code Playgroud)

曾是:

$("#memberSearch").typeahead({
            source: function (query, process) {
                var $this = this //get a reference to the typeahead object
                return $.get('/getSwimmerListJSON',function(data){
                    var options = [];
                    $this["map"] = {}; //replace any existing map attr with an empty object
                    $.each(data,function (i,val){
                        options.push(val.name);
                        $this.map[val.name] = val.id; //keep reference from name -> id
                    });
                    return process(options);
                });
            },
            updater: function (item) {
                console.log(this.map[item],item); //access it here

            }

        });
Run Code Online (Sandbox Code Playgroud)