Select2 с AJAX и исходными локальными данными

Итак, я пытаюсь заставить плагин select2 работать с приложением Backbone.js/CakePHP. Идея состоит в том, что этот select2 содержит адреса электронной почты для связи с людьми по мере выполнения задач, но форму можно редактировать. Что я хочу сделать, так это (1) загрузить/отобразить все уже сохраненные адреса электронной почты для редактируемой задачи и (2) я хочу, чтобы select2 выполнял поиск AJAX для получения списка распознанных электронных писем. У меня по-прежнему возникает эта проблема, когда я могу либо показать исходные данные, либо использовать функцию поиска AJAX.

Мой текущий код для моего блока select2 — это Backbone.View, и он выглядит так:

define([
    'backbone',
    'jquery',
    'jquery.select2'
],
function(Backbone, $, select2) {

    var notificationSelector = Backbone.View.extend({

        notifications: undefined,

        events: {
            'change' : 'select2ContactsChanged'
        },

        initialize: function(attrs) {
            this.collection.on('add remove reset', this.render(), this);
            this.select2ContactsChanged(); 
        },                              

        render: function() {

            var contacts = ["[email protected]", "[email protected]"];
            $('.notification-selector').attr('value', contacts);



            if(this.select2Control == undefined) 
            {
                // Do Search() + query here
                this.select2Control = this.$el.select2({
                    width: '200px',
                    placeholder: '@email',
                    tags: [],
                    minimumInputLength: 3,

                    // initSelection: function(element, callback) {
                    //  return $.ajax({
                    //      type: "GET",
                    //      url: "/notifications/fetch/",
                    //      dataType: 'json',
                    //      data: { id: (element.val()) },
                    //      success: function(data) {

                    //      }
                    //  }).done(function(data) {
                    //      console.log(data);
                    //  });
                    // },

                });
            }
            else
            {
                // Do Search() + query here
                this.select2Control = this.$el.select2({
                    width: '200px',
                    placeholder: '@email',
                    tags: [],
                    minimumInputLength: 3,

                    ajax: {
                        url: '/notifications/search/',
                        dataType: 'json',
                        data: function(term, page) {
                            return {
                                SearchTerm: term
                            };
                        },

                        results: function(data, page) {
                            return {
                                results: data
                            };
                        }
                    }
                });
            }

        },

        select2ContactsChanged: function() {
            var contacts = this.select2Control.val().split(',');
            this.collection.reset(contacts);
        }

    });

    return notificationSelector;
});

Я прочитал ответ создателя Select2 другому человеку (https://github.com/ivaynberg/select2/issues/392), в котором он говорит использовать «пользовательский запрос» для достижения того, что мне кажется нужным. У меня возникли проблемы с поиском подходящих примеров или пониманием документации, чтобы понять, что он имеет в виду. Может ли кто-нибудь определить, что я делаю неправильно/отсутствует?

Спасибо за ваше время!

РЕДАКТИРОВАТЬ Я забыл упомянуть - элемент DOM, к которому он прикреплен, равен <input type="hidden" multiple="true" class="notification-selector select2-result-selectable"></input>


person Mister R2    schedule 14.06.2013    source источник


Ответы (1)


Хорошо, я наконец понял решение. Я неправильно понял $.ajax() - я действительно не думал о том, что это на самом деле асинхронный вызов. Мой код для проверки данных, возвращаемых из вызова, выполнялся до фактического завершения AJAX, поэтому я всегда становился неопределенным.

Я назначил переменную вызову AJAX и установил «async: false», и это сработало отлично.

fetchSetNotifications: function() {
            var addresses = $.ajax({
                method: 'GET',
                dataType: 'json',
                context: $('#notifications'),
                url: '/Notifications/fetch/',
                async: false,

            alert(addresses);
        }

Объект jqXHR, который я получаю в «адресах», затем содержит данные ответа, которые я хочу, в атрибуте «responseText».

person Mister R2    schedule 14.06.2013
comment
Стоит отметить, что синхронные запросы AJAX устарели и никогда не должны использоваться: developers.google.com/web/updates/2012/01/ и blogs.msdn.microsoft.com/wer/2011/08/03/ - person Denilson Sá Maia; 13.02.2018