2016-02-22 81 views
7

好吧,我覺得我會在這裏瘋狂。我使用的是select2 jquery插件(版本4),並通過ajax檢索數據。所以你可以輸入一個名字,它會返回這個聯繫信息。但我也想要返回聯繫人所屬的組織。Select2 - 通過ajax回傳附加數據

這是我的選擇2初始化:

$('#contact_id').select2({ 
    ajax: { 
     url: 'example.com/contacts/select', 
     dataType: 'json', 
     delay: 250, 
     data: function (params) { 
      return { 
       q: params.term, 
       page: params.page 
      }; 
     }, 
     processResults: function (data) { 
      return { 
       results: data 
      }; 
     }, 
     cache: true 
    }, 
    minimumInputLength: 3, 
    maximumSelectionLength: 1 
}); 

這裏是我返回的數據(laravel框架):

foreach($contacts as $con) { 
    $results[] = [ 
     'id' => $con->contact_id, 
     'text' => $con->full_name, 
     'org' => [ 
      'org_id'  => $con->organization_id, 
      'org_name'  => $con->org_name 
     ] 
    ]; 
} 

return response()->json($results); 

所以不是「組織」應該被附加到創建的選項或通過select2選擇元素?所以我可以做類似$('#contact_id').select2().find(':selected').data('data').org$('#contact_id').select2().data('data').org或類似的東西?

理想化,這看起來像:

<select> 
    <option value="43" data-org="{org_id:377, org_name:'Galactic Empire'}">Darth Vader</option> 
</select> 

我發誓,我證實了這一點,上週的工作,但現在它完全忽略了組織屬性。我已經確認返回的json數據包含org_id和org_name。我一直沒能在網上挖什麼都漲,的documentation僅此片段:

ID和文本屬性,則需要在每個對象上,而這些都是選擇二使用的內部數據對象的屬性。傳入數據對象的任何附加參數都將包含在Select2公開的數據對象中。

那麼誰能幫助我呢?我已經浪費了幾個小時。

編輯:因爲我還沒有得到任何迴應,我目前的計劃是使用processResults回調產卵隱藏輸入字段或JSON塊,我將在我的代碼日後參考。考慮到這種情況,我覺得這是一種拙劣的解決方案,但如果沒有別的辦法,那就是我會做的。我寧願這樣做,而不是做另一個Ajax電話來獲得組織。當我開始實施它時,我會發布我的解決方案。

+0

嗨,我現在面臨同樣的問題。我需要使用數據屬性理想地傳遞其他數據(不僅是id和文本)。你解決了這個問題嗎? – slick

+0

你有沒有得到一個工作解決方案呢? –

+0

我添加了我的解決方案。 –

回答

0

不記得我做錯了什麼,但與processResults(data),數據包含完整的響應。在我下面的實現中,我選擇一個項目時訪問此信息:

$('#select2-box').select2({ 
    placeholder: 'Search Existing Contacts', 
    ajax: { 
     url: '/contacts/typeahead', 
     dataType: 'json', 
     delay: 250, 
     data: function(params){ 
      return { 
       q: params.term, 
       type: '', 
       suggestions: 1 
      }; 
     }, 
     processResults: function(data, params){ 
      //Send the data back 
      return { 
       results: data 
      }; 
     } 
    }, 
    minimumInputLength: 2 
}).on('select2:select', function(event) { 
    // This is how I got ahold of the data 
    var contact = event.params.data; 

    // contact.suggestions ... 
    // contact.organization_id ... 
}); 



// Data I was returning 
[ 
    { 
     "id":36167, // ID USED IN SELECT2 
     "avatar":null, 
     "organization_id":28037, 
     "text":"John Cena - WWE", // TEXT SHOWN IN SELECT2 
     "suggestions":[ 
      { 
       "id":28037, 
       "text":"WWE", 
       "avatar":null 
      }, 
      { 
       "id":21509, 
       "text":"Kurt Angle", 
       "avatar":null 
      }, 
      { 
       "id":126, 
       "text":"Mark Calaway", 
       "avatar":null 
      }, 
      { 
       "id":129, 
       "text":"Ricky Steamboat", 
       "avatar":null 
      }, 
      { 
       "id":131, 
       "text":"Brock Lesnar", 
       "avatar":null 
      } 
     ] 
    } 
] 
2

現在(低信譽)不能發表評論...所以...回答到滑頭:

包括附加數據(V4.0):

processResults: function (data) { 
    data = data.map(function (item) { 
     return { 
      id: item.id_field, 
      text: item.text_field, 
      otherfield: item.otherfield 
     }; 
    }); 
    return { results: data }; 
} 

讀取數據:

var data=$('#contact_id').select2('data')[0]; 
console.log(data.otherfield); 
+0

謝謝你,上面的解決方案解決了我的問題並節省了我的時間 – widjajayd