2016-12-28 4 views
1

Это моя первая попытка с select2, и я поражаю проблему, которая, вероятно, является чем-то основным.Select2 issues population select

Выбор: контрольный код:

<select class="form-control" id="trade-select" name="trade-select"> 
    <option>...</option> 
</select> 

Я использую следующий код для извлечения данных с помощью функции ColdFusion:

var options = 
    { 
     theme: 'bootstrap', 
     ajax: 
     {  
      url: "/ajax/search-trades.cfm", 
      dataType: 'json', 
      data: function (params) { return { query: params.term, 'groups_only': true }; }, 

      processResults: function (data, page) 
      { // parse the results into the format expected by Select2. 
       alert(data.DATA); // see note further below 
       return {results: data.DATA, more: false}; 
      } 

     } 
    }; 

    $('#trade-select').css('width', '100%').select2(options) 
     .on('change', function(event) 
     { 
      if (this.value == '') return; 
      $('#trade-select').val('').trigger('change'); 
     }); 

Необработанные данные в формате JSON от вызова к АЯКС URL заключается в следующем:

{"COLUMNS":["TRADE_CATEGORY"],"DATA":[["Appliance Repairs"],["Furniture Repair"],["Painting &amp; Decorating"]]} 

Предупреждение в приведенном выше коде возвращает следующее: essenti союз разделенный запятыми список без каких-либо скобок или что-нибудь:

Appliance Ремонт, ремонт мебели, картины & Украшать

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

Не уверен, что я предоставил достаточно информации, поэтому дайте мне знать, если вам нужно что-нибудь еще.

Для любого разработчика ColdFusion, у которого может быть идея, следующий шаблон ColdFusion вызывается через URL-адрес ajax. Я понимаю, что я мог бы сделать вызов непосредственно к CFC без промежуточного шаблона:

<cfsilent> 
<cfparam name="url.groups_only" default="true"> 
<cfparam name="url.query" default=""> 

<cfset oSystem = createObject("component","cfcs.system")> 
<cfset qTradeCategories = oSystem.getTradeCategories(
    groups_only=url.groups_only, 
    query=url.query)> 
</cfsilent> 
<cfoutput>#SerializeJSON(qTradeCategories)#</cfoutput> 
+0

(Edit) Глядя на примерах, Выбор2 ожидает данные, чтобы быть в другом, чем ваш CFM скрипт возвращается. [Этот пример] (https://select2.github.io/examples.html) предполагает, что он ожидает массив структур, подобный этому [[id: 0, text: 'enhancement]}]. Это не то, что возвращает ваш CF-скрипт. Либо измените скрипт, чтобы вернуть правильную структуру для начала, либо зациклируйте объект 'data' внутри внутри' processResults() 'и постройте структуру select2. – Leigh

+0

@Leigh, это как раз мой пример в ответе :) – Dekel

+0

Хорошо, я попробую и вернусь. Я уверен, что ты прав. – user460114

ответ

4

Структура results должна представлять собой список объектов, где каждый объект должен иметь id и text ключей:

[ 
    { 
    'id': 4, 
    'text': 'some text' 
    }, 
    { 
    'id': 3, 
    'text': 'some other text' 
    } 
] 

Поскольку ваши данные не в этой структуре - вы можете убедиться, что вы посылаете правильную структуру, или сгенерирован его в JavaScript:

results: data.DATA.reduce(function(a, b) { 
     a.push({'id': b[0], 'text': b[0]}) 
     return a; 
}, []) 

data = [["Appliance Repairs"],["Furniture Repair"],["Painting &amp; Decorating"]] 
 

 
console.log(data.reduce(function(a, b) { 
 
    a.push({'id': b[0], 'text': b[0]}) 
 
    return a; 
 
}, []))

+0

Как будет выглядеть ответ, если я верну ID с сырым JSON следующим образом: «DATA»: [[1, «Ремонт оборудования»], [26, «Ремонт мебели»], [43, «Картина & Отделка»] ]? – user460114

+0

Вы можете изменить его на 'a.push ({'id': b [0], 'text': b [1]})' – Dekel

+0

Ты мужчина! – user460114

Смежные вопросы