2015-09-26 19 views
9

Tôi đang di chuyển sang select2 to use as a tagging plugin từ một plugin khác nhưng có một khoảng trống mà tôi đang cố gắng tìm ra nếu select2 có thể hỗ trợ.Với plugin jquery select2 có thẻ: đúng, bạn có thể ngăn các lựa chọn hiển thị trong trình đơn thả xuống đã được chọn như thế nào?

Hãy xem ví dụ. Cho phép nói rằng danh sách các lựa chọn (quay trở lại phía máy chủ từ yêu cầu Ajax) là

"Dog", "Cat", "Monkey", "Giraffe" 

Trong plugin cũ Tôi đang sử dụng, sau khi tôi chọn một trong những lựa chọn (cho phép nói "Cát") và nó xuất hiện trong hộp văn bản, lần sau tôi tìm kiếm cùng một chuỗi (cho phép nói "Ca"), nó KHÔNG "T có" Cat "hiển thị trong danh sách lựa chọn (vì nó biết rằng trước đó bạn đã chọn nó)

Có vẻ như select2 vẫn hiển thị mục trong trình đơn thả xuống khi tìm kiếm bất kể bạn đã chọn nó chưa. Chọn 2 không ngăn nhập nếu sau khi bạn nhấn enter nhưng điều này có vẻ hơi khó hiểu vì vậy tôi đang cố gắng tìm hiểu xem có cách nào không để select2 nhân rộng cùng một hành vi ior từ các plugin khác (nơi các lựa chọn thậm chí không hiển thị)

Một ví dụ khác về cách này hoạt động đúng cách, phần thẻ stackoverflow của câu hỏi cũng làm đúng. Nếu tôi thêm "jquery" vào danh sách các thẻ cho câu hỏi này và sau đó tìm kiếm "jquery" một lần nữa, nó DOESN "T cho thấy rằng trong danh sách (như đã được chọn). Đó là hành vi mà tôi đang tìm kiếm cho

đây là mã Select2 hiện tại của tôi:.

HTML:

<select id="Tags" name="Tags" multiple="multiple"> 
</select> 

Javascript:

function SetupAppTags() { 
$("#Tags").select2({ 
    theme: "classic", 
    width: "98%", 
    tags: true, 
    ajax: { 
     url: "/Tag/Search", 
     dataType: 'json', 
     delay: 300, 
     data: function(params) { 
      return { q: params.term }; 
     }, 
     processResults: function(data, params) { 
      return { results: data }; 
     }, 
     cache: false 
    }, 
    escapeMarkup: function(markup) { return markup; }, 
    minimumInputLength: 3, 
    templateResult: tagFormatResult, 
    templateSelection: tagSelectionResult 
}); 
} 

function tagFormatResult(tag) { 

    if (tag.loading) { 
    return "Loading . . ."; 
} else { 
    if (tag.name) { 
     return tag.name; 
    } 
    return tag.text + " [NEW]"; 
} 
} 

function tagSelectionResult(tag) { 
    if (tag.name) { 
    return tag.name; 
    } 
    return tag.text; 
} 

Tôi nghĩ rằng bằng cách nào đó trong hàm templateResult có một cách để trả về false hoặc một cái gì đó không hiển thị mục đó nếu nó đã được chọn. Là một cái gì đó như thế này có thể (không thể tìm thấy bất cứ điều gì trên mạng hoặc trong các tài liệu)

Trả lời

5

Nó có vẻ như bạn đang tìm kiếm a custom matcher. Sử dụng một cái sẽ cho phép bạn lọc các mục thả xuống trước khi hiển thị nó cho người dùng.

var $t = $('#target'); 
 
$t.select2({ 
 
    multiple: true, 
 
    tags: true, 
 
    data: ["Pasty", "Pasta", "Posters"], 
 
    matcher: function(params, option) { 
 
    var selected = $t.select2('data'); 
 
    var optionSelected = selected.some(function(item) { 
 
     return (item.text === option.text); 
 
    }); 
 
    if (optionSelected) return false; 
 
    return option; 
 
    } 
 
});
#target { 
 
    width: 100%; 
 
}
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script> 
 
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" /> 
 
<select id="target"></select>

+0

bạn có biết khác nhau giữa một matcher tùy chỉnh so với null trả về trong hàm templateResult? – leora

+0

@leora Tôi đã xem qua các tài liệu và đã thực hiện một số gỡ lỗi, cả hai đều là các tùy chọn khả thi khi chúng cung cấp chức năng trùng lặp đôi chút. Từ các tài liệu: _ "[Select2 sử dụng]' matcher' để xác định xem [mỗi kết quả] sẽ được hiển thị. "_ _" 'TemplateResult' cũng có thể trả về' null', điều này sẽ ngăn chặn tùy chọn hiển thị trong danh sách kết quả. "_ Như bạn có thể thấy, chúng cho phép người dùng thực hiện tương tự thông qua các tuyến đường khác nhau. Tại sao thư viện được thiết kế như thế này không phải là quá rõ ràng, nhưng lý do có lẽ là dễ sử dụng nếu bạn chỉ muốn thay đổi một hoặc khác trong các chi tiết nhỏ. – Nit

+1

Cảm ơn bạn đã theo dõi – leora

0

Bạn nên xem xét thay đổi chức năng templateResult ...

Chức năng templateResult nên trả về một chuỗi chứa văn bản được được hiển thị hoặc một đối tượng (chẳng hạn như đối tượng jQuery) có chứa dữ liệu sẽ được hiển thị. Nó cũng có thể trả về null, điều này sẽ ngăn không cho tùy chọn hiển thị trong danh sách kết quả.

https://select2.github.io/options.html#templateSelection

+1

nhờ James. Tôi đã cập nhật câu trả lời ytour với giải pháp dường như hoạt động. Vui lòng cho tôi biết nếu bạn thấy bất kỳ vấn đề nào với giải pháp của tôi hoặc có đề xuất khác – leora

+0

Thực ra, tôi vừa nhận ra câu trả lời ở trên mà tôi đã thêm vào câu hỏi của bạn DOESN "T hoạt động như thể bạn xóa thẻ nó vẫn hiển thị trong danh sách để bạn nhận được một vấn đề mà nếu bạn loại bỏ một thẻ và muốn thêm nó trở lại, nó không cho phép bạn .. Vì vậy, tôi trở lại bảng vẽ.Bạn có biết làm thế nào tôi có thể ngăn chặn? – leora

+0

xin lỗi tôi không :(Tôi chưa bao giờ sử dụng nó trước đây nhưng từ đọc tài liệu nó trông giống như nó sẽ làm việc – JamesHalsall

-1

Bạn có thể đạt được điều này chỉ đơn giản như dưới đây,

Bạn cần phải che giấu các tùy chọn lựa chọn sử dụng CSS

$('select').select2();
.select2-container--default .select2-results__option[aria-selected=true] { 
 
    display: none; 
 
}
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script> 
 

 
<select id="Tags" name="Tags" multiple="multiple"> 
 
    <option value="1">first</option> 
 
    <option value="2">second</option> 
 
    <option value="3">third</option> 
 
    <option value="4">fourth</option> 
 
</select>

+2

Đó là một thủ thuật mà hoạt động, nhưng nó có thể gây ra một vấn đề khác, như lựa chọn bàn phím –

+0

@ MarcosPérezGude đồng ý .. – jlocker

+0

Hey, đừng lo lắng, tôi làm cho nó trong một dự án và nó hoạt động, nhưng trong các tình huống khác tôi không thể viết thủ thuật này Tùy thuộc vào nhu cầu của OP.Chúc may mắn! –

Các vấn đề liên quan