前段時間使用了Select2控件處理下拉菜單,搞了一整天才搞明白,記錄下心得。參考官網http://ivaynberg.github.io/select2/#documentation
該控件我使用了兩種方式:1、基本用法;2、AJAX用法。
先說第一個基本用法,該方式適用於比較小數據量時,一次把所有數據加載到template里邊的<select>組件,然后由Select2對<select>進行解析,例如:
<select id="system" name="system" style="width:100%" > <option value="">請選擇系統-------</option> {% for sys in sys_list %} <option value={{ sys.id }}>{{ sys.name }}</option> {% endfor %} </select> <script> $(document).ready(function () { $("#system").select2(); }); </script>
我使用了Django框架,數據以列表形式返回給前台,控件效果:

接下來是AJAX用法,可以分成兩部分:后台數據源;前台設置。先說后台數據源部分,參考代碼:
def ajax(request): """ AJAX數據源視圖-系統模塊 """ start = int(request.GET.get('iDisplayStart', '0')) length = int(request.GET.get('iDisplayLength', '30')) search = request.GET.get('sSearch', '') #取得前台控件輸入的關鍵字 if search: #截取查詢結果對象,以start開始截取start+length位 orgs = Info.objects.filter( Q(name__icontains=search) & Q(deleted=False) )[start:start + length] else: orgs = Info.objects.all()[start:start + length] val_list = [] for org in orgs: val_list.append({'id': org.id, 'name': org.name})
"""
根據關鍵字查詢得到結果后開始拼裝返回到前台的數據。先生成字典型數組,一般SELECT2組件使用的話生成id、name兩個字段即可
"""
json_data = json.dumps(val_list) return HttpResponse(json_data, 'application/json')
前台設置部分代碼:
<script>
//機構自動搜索
function resultFormatResult(orgs) { {# 下拉選項名稱 #}
return '<div>' + orgs.name + '</div>';
}
function resultFormatSelection(orgs) { {# 選取后顯示的名稱 #}
return orgs.name;
}
$(document).ready(function () {
$("#company").select2({
placeholder: "點擊查詢機構",
minimumInputLength: 2, {# 最小查詢參數 #}
multiple: flase, {# 多選設置 #}
ajax: {
url: '/admin/organizations/ajax/', {# ajax后台函數路徑 #}
dataType: "json", {# 傳輸的數據類型,一般使用json或jsonp,jsonp比較復雜,需要APIKEY,暫時沒進行研究 #}
type: "GET", {# GET即為前台JS向后台函數取數據,POST反之 #}
quietMillis: 1000, {# 延時查詢毫秒數 #}
data: function (term, page) {
return {
sSearch: term, {# term為前台輸入的查詢關鍵字,保存到sSearch對象,即后台保存關鍵字的對象 #}
page: 10 {# 每次查詢的結果數 #}
};
},
results: function (data, page) {
return {
results: data {# results結果集,data為后台返回的查詢結果 #}
};
}
},
formatSelection: resultFormatSelection, // 設定查詢樣式
formatResult: resultFormatResult, // 設定查詢結果樣式
dropdownCssClass: "bigdrop", // 設定SELECT2下拉框樣式,bigdrop樣式並不在CSS里定義,暫時沒深入研究
escapeMarkup: function (m) {
return m;
},
initSelection: function (element, callback) { {# 默認顯示option項 #}
var compName = document.getElementById("companyName").value;var data = {name:compName};
callback(data);
});
});
</script>
<div class="form-group {% if form.company.errors %} has-error{% endif %}"> <label class="col-sm-4 control-label">所屬機構</label> <div class="col-sm-6"><input id="company" name="company" type='hidden' style="width:100%" class="populate placeholder" value="{{ modify_company.id }}" required="True" /> <input id="companyName" hidden="hidden" value="{{ modify_company.name }}" /> </div> </div>
生成的效果圖

大概的說明看代碼注釋,initSelection這個參數要重點說下,當時糾結了好久。
我使用了一個隱藏的<input id="companyName">存放companyName,然后initSelection可以取其值來callback,然后可見的<input id="company">供Select2解析。
