Làm cách nào để thay đổi giá trị được chọn của thả xuống select2 bằng JqGrid?


178

Tôi đang sử dụng bản demo select2 của Oleg , nhưng tôi tự hỏi liệu có thể thay đổi giá trị hiện được chọn trong menu thả xuống hay không.

Ví dụ: nếu bốn giá trị được tải là: "Any", "Fruit", "Vegetable", "Meat"và danh sách thả xuống được mặc định "Any", làm thế nào tôi có thể thay đổi giá trị đó thành "Fruit"trong sự kiện JqGrid loadComplete?

Điều này có thể không?

Câu trả lời:


407

Đối với phiên bản select2> = 4.0.0

Các giải pháp khác có thể không hoạt động, tuy nhiên các ví dụ sau sẽ hoạt động.

Giải pháp 1: Làm cho tất cả các sự kiện thay đổi được đính kèm kích hoạt, bao gồm select2

$('select').val('1').trigger('change');

Giải pháp 2: Gây ra sự kiện thay đổi JUST select2 để kích hoạt

$('select').val('1').trigger('change.select2');

Xem jsfiddle này cho ví dụ về những điều này. Cảm ơn @minlare cho Giải pháp 2.

Giải trình:

Nói rằng tôi có một người bạn tốt nhất chọn tên của mọi người. Vì vậy, Bob, Bill và John (trong ví dụ này tôi cho rằng Giá trị giống như tên). Đầu tiên tôi khởi tạo select2 trên phần chọn của mình:

$('#my-best-friend').select2();

Bây giờ tôi tự chọn Bob trong trình duyệt. Tiếp theo Bob làm điều gì đó nghịch ngợm và tôi không thích anh ta nữa. Vì vậy, hệ thống bỏ chọn Bob cho tôi:

$('#my-best-friend').val('').trigger('change');

Hoặc nói rằng tôi làm cho hệ thống chọn tiếp theo trong danh sách thay vì Bob:

// I have assume you can write code to select the next guy in the list
$('#my-best-friend').val('Bill').trigger('change');  

Ghi chú trên trang web Chọn 2 (xem Phương pháp không dùng nữa và đã xóa ) có thể hữu ích cho người khác:

.select2 ('val') Phương thức "val" đã không được chấp nhận và sẽ bị xóa trong Chọn2 4.1. Phương thức không dùng nữa không bao gồm tham số triggerChange.

Bạn nên gọi trực tiếp .val trên phần tử cơ bản thay thế. Nếu bạn cần tham số thứ hai (triggerChange), bạn cũng nên gọi .trigger ("thay đổi") trên phần tử.

$('select').val('1').trigger('change'); // instead of $('select').select2('val', '1');

8
Đây là câu trả lời đúng: nó hoạt động trong cả hai lựa chọn đơn và đa lựa chọn
Giovanni Di Milia

4
Đây chỉ là một giải pháp có thể chấp nhận nếu một người không có bất kỳ hành động tùy chỉnh nào được liên kết với changesự kiện (như tải lại biểu mẫu). Nếu không, những hành động đó sẽ được gọi một cách dư thừa khi được kích hoạt change().
van_ Scratchmert

Nếu điều này không hoạt động chính xác, hãy thêm setTimeout: setTimeout (function () {$ ("select"). Val ("1"). Trigger ("change");}, 1000);
Abel

@van_ Scratchmert Tôi có vấn đề tương tự. Lý tưởng nhất, tôi muốn thay đổi những gì được hiển thị như đã chọn, mà không khởi động một sự kiện (vì tôi có một tùy chỉnh bị ràng buộc onChange)
onebree

1
Xem câu trả lời của tôi dưới đây để biết ví dụ về cách giải quyết vấn đề
@van_ Scratchmert

135

Nhìn vào các tài liệu select2 bạn sử dụng dưới đây để nhận / đặt giá trị.

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

@PanPipes đã chỉ ra rằng điều này đã thay đổi trong 4.x (hãy ném cho anh ta một upvote bên dưới). valbây giờ được gọi trực tiếp

$("#select").val("CA");

Vì vậy, trong phạm vi loadCompletecủa jqGrid, bạn có thể nhận được bất kỳ giá trị nào bạn đang tìm kiếm sau đó đặt giá trị hộp chọn.

Thông báo từ các tài liệu

Lưu ý rằng để sử dụng phương thức này, bạn phải xác định hàm initSelection trong các tùy chọn để Chọn2 biết cách chuyển đổi id của đối tượng bạn truyền trong val () sang đối tượng đầy đủ mà nó cần để hiển thị lựa chọn. Nếu bạn đang gắn vào một phần tử chọn, chức năng này đã được cung cấp cho bạn.


Không xuất hiện để làm việc với bản demo tôi đang xem. Không chắc chắn tại sao, nó có thể là một cái gì đó để làm với cách nó cắm vào JqGrid.
Adam K Dean

1
Cập nhật câu trả lời. Có vẻ như bạn sẽ phải thêm chức năng đó vào khởi tạo select2 theo cách thủ công để nó biết cách xử lý valcuộc gọi.
Jack

1
@AdamKDean: Người ta có thể kiểm tra bổ sung xem <select>nơi được chuyển đổi thành select2kiểm soát bằng cách kiểm tra sự tồn tại của lớp select2-offscreentrên <select>. Tất cả các yếu tố của thanh công cụ tìm kiếm có id bắt đầu bằng gs_tiền tố và có tên như trong colModel. Bạn có thể sử dụng getGridParamđể có được colModel.
Oleg

Cảm ơn, tôi đã quản lý để có được thông tin bộ lọc, tôi chỉ cần một cách để đặt nó sau khi thanh lọc được tạo lại với select2lựa chọn. Tôi sẽ có một cái nhìn khác ngày hôm nay, có thể với đôi mắt mới tôi có thể sửa nó. Cảm ơn một lần nữa. Cập nhật: gói mã trong kiểm tra boolean đã khắc phục sự cố tôi gặp phải, mặc dù nó đã dừng làm mới thanh tìm kiếm thay vì chọn lại phần tử trước đó.
Adam K Dean


32
this.$("#yourSelector").select2("data", { id: 1, text: "Some Text" });

điều này nên được giúp đỡ


3
Ví dụ về nhiều giá trị: this. $ ("# YourSelector"). Select2 ("data", [{id: 1, text: "Một số văn bản"}, {id: 2, text: "Một số văn bản khác"}]);
RodneyRd

18

Điều này sẽ còn dễ dàng hơn nữa.

$("#e1").select2("val", ["View" ,"Modify"]);

Nhưng hãy chắc chắn rằng các giá trị mà bạn vượt qua đã có trong HTMl


17

Nếu bạn muốn thêm mới value='newValue'text='newLabel', bạn nên thêm mã này:

  1. Thêm tùy chọn mới vào <select>:

    var opt = "<option value='newValue' selected ='selected'>" + newLabel+ " </option>";
    $(selLocationID).html(opt);
  2. <select>Thay đổi kích hoạt thành giá trị được chọn:

    $(selLocationID).val('newValue').trigger("change");

Tôi thấy điều này sạch hơn là làm rối với select2 'data' :) Thay đổi dom, hãy để select2 tìm ra phần còn lại.
Paulj

Tôi đang thử nghiệm trên Safari và đây là giải pháp duy nhất thực sự hoạt động. Những người khác thì hùng hồn hơn và tôi thích họ, nhưng hơn bất cứ điều gì, tôi thích mã làm việc. Và đây là điều đó. :)
David

Cảm ơn một triệu vì điều này! Tôi đang làm việc với 2 hộp chọn trong đó cả hai hộp được điền bằng Ajax và tôi đã sử dụng các thuộc tính dữ liệu bổ sung cho hộp đầu tiên để đặt giá trị của hộp thứ hai bằng cách sử dụng giá trị này. Một lần nữa cảm ơn bạn !!!!
Sam

16

Chỉ muốn thêm một câu trả lời thứ hai. Nếu bạn đã kết xuất lựa chọn dưới dạng select2 , bạn sẽ cần phải có phản hồi đó trong bộ chọn của mình như sau:

$("#s2id_originalSelectId").select2("val", "value to select");

12

Bạn có hai tùy chọn - như @PanPipes trả lời trạng thái bạn có thể làm như sau.

$(element).val(val).trigger('change');

Đây chỉ là một giải pháp có thể chấp nhận nếu một người không có bất kỳ hành động tùy chỉnh nào bị ràng buộc với sự kiện thay đổi. Giải pháp tôi sử dụng trong tình huống này là kích hoạt một sự kiện cụ thể select2 cập nhật lựa chọn hiển thị select2.

$(element).val(val).trigger('change.select2');

Vâng, đây là giải pháp toàn diện tốt nhất. Thực sự, tôi nghĩ rằng Chọn2 sẽ tự động kích hoạt sự kiện 'change.select2' để cập nhật màn hình khi giá trị được thay đổi. Nhưng, điều này ít nhất cung cấp một cách đơn giản để cập nhật màn hình để phù hợp với giá trị mới, mà không kích hoạt trình xử lý sự kiện thay đổi tùy chỉnh.
DaveInMaine

this '$ (phần tử) .val (val) .trigger (' change.select2 ');' đã làm cho tôi. Cảm ơn bạn @minlare.
Ray

9

Gặp một số rắc rối với việc đặt tùy chọn Chuỗi được chọn trong select2:

Với tùy chọn: "tùy chọn chuỗi1 / tùy chọn" được sử dụng:

$('#select').val("string1").change(); 

NHƯNG với một tùy chọn có giá trị: tùy chọn giá trị "E" chuỗi1 / tùy chọn:

$('#select').val("E").change(); // you must enter the Value instead of the string

Hy vọng điều này sẽ giúp ai đó đấu tranh với cùng một vấn đề.


5

nếu bạn muốn chọn một giá trị duy nhất thì hãy sử dụng $('#select').val(1).change()

nếu bạn muốn chọn nhiều giá trị thì đặt giá trị trong mảng để bạn có thể sử dụng mã này $('#select').val([1,2,3]).change()


điều này sẽ không hoạt động nếu bạn nhập chuỗi dưới dấu ngoặc vuông.
Utkarsh Pandey

5

Đối với V4 Select2 nếu bạn muốn thay đổi cả giá trị của select2 và biểu diễn văn bản của trình đơn thả xuống.

var intValueOfFruit = 1;
var selectOption = new Option("Fruit", intValueOfFruit, true, true);
$('#select').append(selectOption).trigger('change');

Điều này sẽ đặt không chỉ giá trị đằng sau hậu trường mà còn hiển thị văn bản cho select2.

Được kéo từ https://select2.github.io/announcements-4.0.html#remond-methods


Hãy thử kích hoạt ('change.select2'). Trigger ('select2: select'); nếu chỉ thay đổi là không đủ
Tebe

4

Mã dự kiến ​​của tôi:

$('#my-select').val('').change();

hoạt động hoàn hảo cảm ơn @PanPipes cho người hữu ích.


4

làm cái này

 $('select#id').val(selectYear).select2();

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
rollstuhlfahrer

Tôi không có kiến ​​thức về JqGrid nhưng với mã này, bạn có thể thay đổi giá trị select2 theo cách đơn giản
Jaskaran singh Rajal

2

Nếu bạn có nguồn dữ liệu ajax, vui lòng tham khảo phần này để biết lỗi miễn phí

https://select2.org/programmatic-control/add-select-clear-items

// Thiết lập điều khiển Chọn2

$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Lấy mục đã chọn và thêm vào điều khiển

var studentSelect = $('#mySelect2');
$.ajax({
    type: 'GET',
    url: '/api/students/s/' + studentId
}).then(function (data) {
    // create the option and append to Select2
    var option = new Option(data.full_name, data.id, true, true);
    studentSelect.append(option).trigger('change');

    // manually trigger the `select2:select` event
    studentSelect.trigger({
        type: 'select2:select',
        params: {
            data: data
        }
    });
});

1

nếu bạn muốn đặt một mục được chọn khi bạn biết văn bản từ danh sách thả xuống và không biết giá trị, đây là một ví dụ:

Giả sử bạn đã tìm ra múi giờ và muốn đặt nó, nhưng các giá trị có time_zone_idtrong đó.

        var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
        var $select2 = $('#time-zone');
        var selected = $select2.find("option:contains('"+timeZone+"')").val();
        $select2.val(selected).trigger('change.select2'); 

0
// Set up the Select2 control
$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Fetch the preselected item, and add to the control
var studentSelect = $('#mySelect2');
$.ajax({
    type: 'GET',
    url: '/api/students/s/' + studentId
}).then(function (data) {
    // create the option and append to Select2
    var option = new Option(data.full_name, data.id, true, true);
    studentSelect.append(option).trigger('change');

    // manually trigger the `select2:select` event
    studentSelect.trigger({
        type: 'select2:select',
        params: {
            data: data
        }
    });
});

Phông chữ: Chọn 2 tài liệu


0

bạn chỉ có thể sử dụng phương thức get / set để đặt giá trị

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

hoặc bạn có thể làm điều này:

$('#select').val("E").change(); // you must enter the Value instead of the string
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.