Как получить доступ к тексту Select2, когда есть несколько экземпляров select2? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующий код, который работает с первым селектором и предоставляет искомый результат, а именно, результаты, где символы с первого по k-й соответствуют рангу выше результатов, где символы просто существуют в строке параметров.(т.е. входная строка "ka" будет ранжировать Канзас выше Аляски)

Сбой при запуске в одном из других экземпляров select2 на сайте.Код выглядит следующим образом:

$(document).ready(() => {
userSettings.init()    
$('.select2').select2({        
    sorter: function(data) {
        return data.sort(function (a, b) {
            // Declare levenshtein algorithm
            var levenshtein = require('fast-levenshtein');

            // Trim and set to lowercase on the inputs
            a = a.text.trim().toLowerCase();
            b = b.text.trim().toLowerCase();

            /* This is the problem.  I need a better way to retrieve the
            input value in order to test it's fitness against my options. */
            var input = $('.select2-search__field').val().trim().toLowerCase();

            // Weigh by those that match the input in the beginning of the string first, and then list the rest that only contain the string next.
            if (!isUndefined(input) && input.length > 0) {
                if(input == a.substring(0, input.length))  {
                    return -1;
                } else if (input == b.substring(0, input.length))  {
                    return 1;
                } else {
                    // Input doesn't match the beginning of the string, still return strings with matching characters. 
                    return levenshtein.get(a, input) - levenshtein.get(b, input);
                }
            }
        });
        // Function to ensure we are not operating on something that is undefined.
        function isUndefined(value){
            // Obtain `undefined` value that's guaranteed to not have been re-assigned.
            var undefined = void(0);
            return value === undefined;
        }
    }
})

});

Как видите, мне нужен лучший способ получить на входе, чем я объявил ввод var.

**** РЕДАКТИРОВАТЬ ****

Я думаю, у меня есть решение.

Я подозреваю, что сортировка происходила так быстро и так часто, чтопросто сдалсяМы проверили это, утешая рабочий процесс и ошибочно потеряли его части.

В качестве решения я вытащил присвоение из фактической функции сортировки и затем передал его.

$(document).ready(() => {
    userSettings.init()    
    $('.select2').select2({sorter: s2_sorter})
});


//Function to do sort on a Select2 Field.
let s2_sorter = function(data) {

/* Obtain the value out of the text field in order to test agaist the options during sort. */
var input = {d:$('.select2-container--open .select2-search__field').val().trim().toLowerCase()};
return data.sort(function (a, b) {
    // Access the varible inside sort.
    let i = input.d;

    // Declare levenshtein algorithm
    var levenshtein = require('fast-levenshtein');

    // Trim and set to lowercase on the inputs
    a = a.text.trim().toLowerCase();
    b = b.text.trim().toLowerCase();

    // Wieght by those that match character first, and then all with the character next.
    if (!isUndefined(i) && i.length > 0) {
        console.log('hassomethign')
        if(i == a.substring(0, i.length))  {
            return -1;
        } else if (i == b.substring(0, i.length))  {
            return 1;
        } else {
            // Input doesn't match the begining of the string, still return strings with matching characters. 
            return levenshtein.get(a, i) - levenshtein.get(b, i);
        }
    }
});
function isUndefined(value){
    // Obtain `undefined` value that's guaranteed to not have been re-assigned.
    var undefined = void(0);
    return value === undefined;
}

};

...