Почему мой datumTokenizer никогда не вызывается?

Я поставил точку останова внутри функции datumTokenizer, но, похоже, она никогда не вызывается. Почему бы и нет? Работает ли он только с удаленными данными?

var engine = new Bloodhound({
    datumTokenizer: function(d) {
        return Bloodhound.tokenizers.obj.whitespace(d);
    },
    queryTokenizer: Bloodhound.tokenizers.nonword,
    identify: function( obj ) { return obj.id; },
    remote: {
        url: '/typeahead/%QUERY',
        wildcard: '%QUERY'
    },
    limit: 5
});

$( '#city_or_zip' ).typeahead({
    hint: true,
    minLength: 2
}, {
    display: function( data ) {
        return formatCityState( data );
    },
    source: engine.ttAdapter(),
    templates: {
        empty: 'No results found',
        suggestion: function ( data ) {
            return '<p>' + formatCityState( data ) + '</p>';
        }
    }
});

JSON вернулся с удаленного:

[  
   {  
      "id":568,
      "state":"al",
      "city":"pittsview"
   },
   {  
      "id":4095,
      "state":"ga",
      "city":"pitts"
   }
]

person Stephen Horvath    schedule 19.05.2015    source источник
comment
здесь return Bloodhound.tokenizers.obj.whitespace(d); вместо d u передать строковое значение Bloodhound.tokenizers.obj.whitespace(name)   -  person sakir    schedule 19.05.2015
comment
Это даже не удар по этому коду. Ничто в функции datumTokenizer не вызывается.   -  person Stephen Horvath    schedule 19.05.2015
comment
@StephenHorvath, ты когда-нибудь работал удаленно?   -  person Zion    schedule 02.01.2016


Ответы (3)


Вот рабочий пример http://jsfiddle.net/x7pLsb79/.

Я немного модифицировал. Вместо удаленных данных я использовал локальные, но оба работают одинаково.

HTML

<input id="city_or_zip" class="typeahead"></input>

js

 var dt=[  
       {  
          "id":568,
          "state":"al",
          "city":"pittsview"
       },
       {  
          "id":4095,
          "state":"ga",
          "city":"pitts"
       }
    ];
    var formatCityState= function(data){
        return data.city+"*formated*"+data.state ;
    }
    var engine = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace("city"),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        local:dt

    });

    $( '#city_or_zip' ).typeahead({
        hint: true,
        minLength: 1
    }, {

         display: function( data ) {
            return formatCityState( data );
        },
        source: engine.ttAdapter(),
        templates: {
            empty: 'No results found',
            suggestion: function ( data ) {
                return '<p>' +  formatCityState(data)  + '</p>';
            }
        }
    });
person sakir    schedule 19.05.2015
comment
Спасибо. Проблема в том, что я хочу написать свой собственный токенизатор. И когда я устанавливаю переменную datumTokenizer в свою функцию, она никогда не вызывается. - person Stephen Horvath; 20.05.2015
comment
эмм, я не уверен, что вы пытаетесь получить в качестве последнего результата, извините. но если вы хотите применить что-то вроде этого (datumTokenizer: Bloodhound.tokenizers.obj.whitespace(mytoken)), я думаю, вам сначала нужен результат фильтра через, фильтр: функция (данные) { вернуть новый массив} - person sakir; 20.05.2015

Удаленные данные не индексируются, как объяснил разработчик в этой проблеме. Есть коммит, чтобы добавить это в качестве опции. Между прочим, проект twitter typeaheadjs в настоящее время заброшен, так что кто знает, когда этот коммит может быть объединен. Есть некоторое движение вокруг форка, в котором коммит, вероятно, будет объединен (см. здесь).

person Ben Creasy    schedule 25.10.2015

Хорошее решение

autocomplete:function(){
        var branchOffice = $('#branch_office_id').val();
        var productSource = new Bloodhound({
            datumTokenizer: function(productObj) {
                return Bloodhound.tokenizers.whitespace([productObj.product.name+' '+productObj.product.sku+' '+productObj.product.code+' '+productObj.product.category.name+' '+productObj.product.unit.name]);
            },
            queryTokenizer: Bloodhound.tokenizers.whitespace,
            prefetch: {
                url: url_product+'/'+branchOffice,
                cache: false,
            }
        });
        $('#search_product').typeahead({
            hint: true,
            highlight: true,
            minLength: 1
        },{
            name: 'name',
            displayKey: function(data) {
                return data.product.name;
            },
            limit: 10,
            source: productSource.ttAdapter(),
            templates: {
                empty: function(){
                    return '<div class="widget-main"><div class="alert alert-danger">No encotramos coincidencias</div></div>'
                },
                suggestion: function (data){
                    return '<div>'+data.product.sku+' - '+data.product.name+' | '+data.product.code+' - '+data.product.category.name+' - '+data.product.unit.name+'</div>'
                }
            }
        });
    }

Пример json

 [{
    "id":29,
    "product_id":10,
    "branch_office_id":6,
    "quantity":0,
    "price_n":"1.00",
    "price_h":"1.00",
    "stock_min":1,
    "product":{
        "id":10,
        "category_id":4,
        "unit_id":2,
        "sku":"010100001",
        "code":"KE-1000011",
        "name":"SIN CATEGORIA",
        "image":"\/image\/avatars\/no_photo.jpg",
        "order":1000011,
        "price_buy":"1",
        "category":{
            "id":4,
            "order":1,
            "code":"01",
            "abr":"KE",
            "name":"KENDA"
        },
        "unit":{
            "id":2,
            "code":"01",
            "name":"PZA"
        }
    }
},
{
    "id":33,
    "product_id":11,
    "branch_office_id":6,
    "quantity":0,
    "price_n":"1.00",
    "price_h":"1.00",
    "stock_min":1,
    "product":{
        "id":11,
        "category_id":4,
        "unit_id":2,
        "sku":"010100002",
        "code":"KE-324233434",
        "name":"SDFSDFSDFSD",
        "image":"\/image\/avatars\/no_photo.jpg",
        "order":324233434,
        "price_buy":"1",
        "category":{
            "id":4,
            "order":1,
            "code":"01",
            "abr":"KE",
            "name":"KENDA"
        },
        "unit":{
            "id":2,
            "code":"01",
            "name":"PZA"
        }
    }
}]
person Giovanni Cespedes Alcocer    schedule 02.03.2017
comment
Ой мужики это очень круто!!! У меня возникла проблема с работой моего экземпляра Bloodhound с локальным массивом объектов, я много гуглил и читал документацию, но не нашел примера того, как правильно работать с массивом пользовательских объектов. Моя проблема была решена с помощью datumTokenizer, как вы здесь. Большое спасибо!! - person Oswaldo Zapata; 21.05.2017