Para a versão select2> = 4.0.0
As outras soluções podem não funcionar, no entanto, os exemplos a seguir devem funcionar.
Solução 1: faz com que todos os eventos de alteração anexados sejam acionados, incluindo select2
$('select').val('1').trigger('change');
Solução 2: faz com que apenas o evento de alteração select2 seja acionado
$('select').val('1').trigger('change.select2');
Veja este jsfiddle para exemplos disso. Obrigado a @minlare pela solução 2.
Explicação:
Digamos que eu tenha um melhor amigo e escolha o nome das pessoas. Então, Bob, Bill e John (neste exemplo, presumo que o valor seja o mesmo que o nome). Primeiro eu inicializo select2 no meu select:
$('#my-best-friend').select2();
Agora eu seleciono Bob manualmente no navegador. Em seguida, Bob faz algo impertinente e eu não gosto mais dele. Portanto, o sistema desmarca Bob para mim:
$('#my-best-friend').val('').trigger('change');
Ou digamos que eu faça o sistema selecionar o próximo na lista em vez de Bob:
// I have assume you can write code to select the next guy in the list
$('#my-best-friend').val('Bill').trigger('change');
Notas no site Select 2 (consulte Métodos obsoletos e removidos ) que podem ser úteis para outras pessoas:
.select2 ('val')
O método "val" foi descontinuado e será removido no Select2 4.1. O método descontinuado não inclui mais o parâmetro triggerChange.
Você deve chamar diretamente .val no elemento subjacente. Se você precisou do segundo parâmetro (triggerChange), também deve chamar .trigger ("change") no elemento
$('select').val('1').trigger('change'); // instead of $('select').select2('val', '1');