Select2 и данные JSON

Я использую select2 версии 4, и у меня есть элемент управления REST на XPage, который считывает столбец полного имени из names.nsf.

У меня работает поиск, но по какой-то причине я не получаю обратно список значений, которые я могу выбрать.

Возвращаемый объект JSON выглядит примерно так:

[{"@entryid":"1376-E6D5EBE8ADBEFA7088257DF8006E4BA2","fullname":"Full Name\/OU\/O"},{"@entryid":"1375-FD1CB92A13BFD0E088257DE4006756D7","fullname":"Another Full Name\/OU\/O"}]

Код для инициализации select2 выглядит так:

x$( "#{id:comboBox1}" ).select2({
  ajax: {
   url: "xJSON.xsp/names",
   dataType: 'json',
   delay: 250,
    data: function (params) {
      return {
      search:'[fullname=]*'+params.term+'*',       
      //  q: params.term, // search term
        page: params.page
      };
    },

    results: function (data, page){

    },
    processResults: function (data, page) {
      // parse the results into the format expected by Select2.
      // since we are using custom formatting functions we do not need to
      // alter the remote JSON data
      console.log(data);
      return {
        results: data
      };
    },
    cache: true
  },
  //escapeMarkup: function (markup) { return markup; }, 
  minimumInputLength: 1
});

Когда я смотрю на консоль браузера, я вижу, что поиск сработал и возвращаются объекты JSON, однако у меня нет списка значений для выбора.

Для возврата результата я пробовал results: data.fullname и results: data, text: 'fullname', но ничего не происходит.

Что я делаю в носке?


person Daniel F    schedule 31.03.2015    source источник


Ответы (2)


Вам нужно либо переключить свой ответ JSON, чтобы включить id и text для каждого объекта, либо повторно сопоставить их в вашем processResults методе. Эти два свойства необходимы для всех выбираемых объектов в Select2 4.0. Поскольку я предполагаю, что вы либо не можете изменить свой ответ JSON, либо это не имеет смысла, вы можете легко повторно сопоставить данные с помощью следующего processResults метода.

processResults: function (data) {
  var data = $.map(data, function (obj) {
    obj.id = obj.id || obj["@entityid"];
    obj.text = obj.text || obj.fullname;

    return obj;
  });

  return {
    results: data
  };
});

Это сопоставит свойство @entityid со свойством id, а свойство fullname со свойством text. Таким образом, выбранные элементы будут отправлены на ваш сервер, содержащие @entityid, и будут отображаться с использованием fullname.


Кроме того, в Select2 4.0 больше не нужен метод results. Он был переименован в текущий метод processResults.

person Kevin Brown    schedule 01.04.2015
comment
Привет, Кевин, большое спасибо за ваш ответ. Это сработало. Единственное, что мне пришлось изменить, так это сделать полное имя obj.id, чтобы иметь возможность выбирать данные из списка результатов. Вы палочка-выручалочка! Еще раз спасибо - person Daniel F; 01.04.2015

Я скопировал ваш код в том виде, в каком он есть, просто изменил fieldname и поисковый запрос, и все прошло нормально.

Это мой JSON выглядит как

[{"@entryid":"1482-AD112B834158AD0D80257E4B004EC42E","@unid":"AD112B834158AD0D80257E4B004EC42E","id":"Victor Hunter","text":"Odhran Patton"},{"@entryid":"1496-291F2480D806A91E80257E4B004EC3D2","@unid":"291F2480D806A91E80257E4B004EC3D2","id":"Wesley O'Meara","text":"Wesley O'Meara"},{"@entryid":"1421-CC19D06880F5DC2980257E4B004EC537","@unid":"CC19D06880F5DC2980257E4B004EC537","id":"Stephen Woods","text":"Emma Doherty"}]

Я знаю, что select2 ожидает параметры id и text от JSON.

person Jorel Jimenez    schedule 21.05.2015