2012-11-07 59 views
50

我有两个被链接选择:第一选择确定哪些项目将被显示在所述第二选择的每个值。SELECT2改变项动态

第二选择的值被存储在二维数组:

[ [{"id":1,"text":"a"}, {"id":2,"text":"b"},...], 
    [{"id":"1a","text":"aa"},{"id":"1b","text":"ba"},...], 
    ... 
] 

第一选择值判定索引被用来填充第二选择。因此,在第一个“更改”事件中,我应该可以修改select-two包含的项目。

阅读文档,我想我需要使用“数据”选项...但不舒尔如何为实例加载在初始化数组数据,它似乎不工作,如果我尝试做初始化后的同一。

HTML

Attribute: 
<select name="attribute" id="attribute"> 
    <option value="0">Color</option> 
    <option value="1">Size</option> 
</select> 

Value: 
<select name="value" id="value"></select> 

<script> 
    var data = [ [{"id":1,"text":"black"}, {"id":2,"text":"blue"},...], 
       [{"id":"1","text":"9"},{"id":"1","text":"10"},...], 
       ]; 
    $('#attribute').select2().bind('change', function(){ 
     // Here I need to change `#value` items. 
     $('#value').select2('data',data[$(this).val()]); // This does not work 
    ); 

    $('#value').select2(); 
</script> 
+3

向我们展示你已经代码。 – Aesthete

+0

添加示例在评论中,我尝试了$('#value')。select2('data',data [$(this).val()]); –

+0

https://stackoverflow.com/questions/16480910/update-select2-data-without-rebuilding-the-control – ndpu

回答

56

我已为你展示如何可以这样做的例子。

通知的JS而且I改变#VALUE到输入元件

<input id="value" type="hidden" style="width:300px"/> 

且本人触发事件change用于获取初始值

$('#attribute').select2().on('change', function() { 
    $('#value').select2({data:data[$(this).val()]}); 
}).trigger('change'); 

Code Example

编辑:

在SELECT2类属性的当前版本正在从隐藏的输入转移到由创建SELECT2根元素,连select2-offscreen类哪些位置的页范围以外的元素的方式。

为了解决这个问题,多数民众赞成所有需要的是在相同的元素将选择2第二次之前添加removeClass('select2-offscreen')

$('#attribute').select2().on('change', function() { 
    $('#value').removeClass('select2-offscreen').select2({data:data[$(this).val()]}); 
}).trigger('change'); 

我添加了一个新的Code Example来解决这个问题。

+1

只需更新您的jsfiddle到当前的select2和jquery源代码即可。 (http://jsfiddle.net/pFY9Z/)你有一个可以与当前版本一起工作的例子吗? – gomad

+4

我已更新我的答案并添加了一个新的代码示例 – iMoses

+0

优秀 - 它再次运行!非常感谢。 – gomad

1

我解决缺乏例如图书馆的位置:

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css" rel="stylesheet"/> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"> 

http://jsfiddle.net/bbAU9/328/

8

尝试使用触发器属性是:

$('select').select2().trigger('change'); 
+11

请解释这是什么以及它为什么回答这个问题。 –

+0

首先为'select'和'trigger'改变新的值,如 '$('select')。select2()。trigger('change'); ('select')。select2()。trigger('change');' – aje

2

在项目中,我使用下面的代码:

$('#attribute').select2(); 
$('#attribute').bind('change', function(){ 
    var $options = $(); 
    for (var i in data) { 
     $options = $options.add(
      $('<option>').attr('value', data[i].id).html(data[i].text) 
     ); 
    } 
    $('#value').html($options).trigger('change'); 
}); 

尝试注释掉选择2部分。其余的代码仍然可以工作。

+0

谢谢,对我来说也很完美。 –

14

我成功地使用下面的动态更新选项:

$control.select2('destroy').empty().select2({data: [{id: 1, text: 'new text'}]});

+0

空()做的伎俩:)! –