2015-07-24 3 views
3

Я использую плагин select2 с удаленными данными ajax. Я вижу результаты в раскрывающемся списке, но не могу их выбрать. Я хочу, чтобы результаты были выбраны и помещены в поле после выбора. Я думаю, что проблема заключается в передаче идентификатора, я не знаю, как правильно его передать .. Любые идеи?select2 ajax показывает результаты, но не может выбрать

мой JSON для tag_word = для ... нет никаких документов

results: [{text: "fort"}, {text: "food"}] 

Вот код:

<select class="js-data-example-ajax" style="width:100%"> 
     <option selected="selected">asdasd</option> 
    </select> 

    <link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" /> 
    <script type="text/javascript" src="{% static 'js/select2.js' %}"></script> 
    <script > 
    $(document).ready(function(){ 
    $('.js-data-example-ajax').select2({ 
    minimumInputLength: 2, 
    multiple:true, 
    delay: 250, 
    cache: true, 
    ajax: { 
     url: '/tags/search/autocomplete/', 
     dataType: 'json', 
     data: function (parms, page) { return { tag_word: parms.term }; }, 
    }, 
    }); 
}); 
    </script> 

здесь код сервера:

def autocomplete(request): 
s = SearchQuerySet(using='autocomplete') 
sqs = s.autocomplete(content_auto=request.GET.get('tag_word'))[:5] 
suggestions = [ {'text':result.tag_word, 
        'id':result.tag_word,} for result in sqs] 
the_data = json.dumps({ 
    'results': suggestions 
}) 
return HttpResponse(the_data, content_type='application/json') 
+0

вы должны использовать ** успех: ** от $ .ajax –

ответ

1

Его быстрый взлом. Не знаете, как вы могли бы согласиться с select2 documentaion. Но следующий код работал со мной в моем localhost.

$(document).ready(function(){ 
     $.get("json/select.json",function(data){ //specify your url for json call inside the quotes. 
      for(var i = 0; i < data.length; i++){ 
       data[i]={id:i,text:data[i].text} 
      } 
      $(".js-data-example-ajax").select2({ 
        minimumInputLength: 2, 
        multiple:true, 
        delay: 250, 
        data: data 
      }) 

    }); 
} 
+0

Если я использую вышеуказанный код, я получаю сообщение об ошибке: http://127.0.0.1:8000/tags/search/autocomplete/ 500 (ОШИБКА ВНУТРЕННЕГО СЕРВЕРА) – Torostar

+0

Хорошо, я сделал это на стороне сервера, t найти решение на стороне клиента. Я просто добавил одно и то же свойство «tag_word» также для id и не только для текста .. теперь работает – Torostar

+0

Выберите правильный ответ, чтобы он был полезен другим, кто ищет на той же базе. –

0

Его потому что вы получили нужный идентификатор. изменить на цифры. Нажмите кнопку «Получить выбранный», чтобы увидеть, что идентификаторы будут переданы только.

var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }]; 

$(document).ready(function(){ 

    $('.js-data-example-ajax').select2({ 
    minimumInputLength: 2, 
    multiple:true, 
    delay: 250, 
    data: data 


    }); 
}); 

$(".checkoutput").click(function(){ 
console.log($('.js-data-example-ajax').val()); 
}) 

Вот JSFIDDLE

+0

мои идентификаторы равны нулю, что проблема вы правильно. Не могли бы вы объяснить, как передать только значения id json? Я попробовал ваше предложение, но не могу заставить его работать. – Torostar

+0

// как передать только значения id в json // Не могу получить вашу точку. Вам нужно сохранить идентификатор и текст. И вам нужно дать уникальное значение для каждого идентификатора. –

+0

да мне нужно как id, так и текст, но я уже получаю текст .. Я пропустил идентификатор, и я не могу понять, как дать уникальное значение каждому идентификатору .. мои текущие результаты: [{text: "fort"}, {text: "food"}] .. нет идентификатора. Как добавить уникальный идентификатор к моим результатам? – Torostar

0

Далее на ваш последний вопрос на ответ Alaksandar, попробуйте добавлять свой код так:

$('.js-data-example-ajax').select2({ 
    minimumInputLength: 2, 
    multiple:true, 
    delay: 250, 
    cache: true, 
    ajax: { 
     url: '/tags/search/autocomplete/', 
     dataType: 'json', 
     data: function (parms, page) { return { tag_word: parms.term }; }, 
     success: function(results){ 
      for(var i = 0; i < results.length; i++){ 
       results[i] = {id:i,text:results[i].text} 
      } 
     } 
    }, 
}); 

Я не тестировал все это. Итак, если это сработает, ответьте на ответ Александара как правильный, а не тот.

+0

спасибо за ваши предложения, но я все еще не могу выбрать элементы, и консоль покажет: результаты: [{text: "fort"}, {text: "food"}] ... без значения id – Torostar

+0

какие у вас парфюмы .term output –

3

Для выбора варианта каждый результат должен иметь уникальный идентификатор. Поэтому вы можете добавить идентификатор, используя следующий код (processResults).

$('.js-data-example-ajax').select2({ 
    minimumInputLength: 2, 
    multiple:true, 
    delay: 250, 
    cache: true, 
    ajax: { 
     url: '/tags/search/autocomplete/', 
     dataType: 'json', 
     data: function (parms, page) { return { tag_word: parms.term }; }, 
     processResults: function (data) { 
        data.results.forEach(function (entry, index) { 
         entry.id = ''+index; // Better if you can assign a unique value for every entry, something like UUID 
        }); 

        return data; 
       }, 
       cache: true 
    }, 
});