Vấn đề:Knockout 'với' ràng buộc và Select2 trong jQuery thoại
Các Select2 jQuery plugin không hoạt động khi sử dụng trên một hộp thoại jQuery lồng nhau dưới một yếu tố mà sử dụng loại trực tiếp with
databinding. Hủy bỏ ràng buộc with
và select2 hoạt động tốt. Nếu with
bị ràng buộc với thuộc tính lồng nhau thì nó ngừng hoạt động.
Bối cảnh:
Vì vậy, tôi phải chiến đấu cho phần tốt nhất là 3 giờ cố gắng để có được Select2 để làm việc trên một hình thức thoại jQuery .... nói về pi $$ ing lên cây sai ngôn , Tôi nghĩ nó hoàn toàn là hộp thoại jQuery và select2. Nó có thể làm việc ngay từ đầu với sửa lỗi _allowInteraction
. Cho đến khi tôi phá vỡ vấn đề ngay xuống các bước đơn giản và nguyên nhân bắt đầu tiết lộ chính nó. Vấn đề là với ràng buộc with
.
Disclaimer
Xin lỗi vì tôi làm việc cho một công ty giống lừa rằng khối jsFiddle. Ngoài ra tôi đã chia nhỏ việc triển khai của mình cho mục đích minh họa vì mô hình thực tế là khá lớn.
// models
function Department() {
this.name = ko.observable('dept1');
this.selectedTeam = ko.observable(new Team());
}
function Team() {
this.name = ko.observable('team1');
}
function MainModel() {
this.department = new Department();
this.showTeam = function() {
$('#addTeamDialog').dialog('open');
};
}
// setup
ko.applyBindings(new MainModel());
\t
$('#addTeamDialog').dialog({
// fix allow select2 to work on the jq dialog
_allowInteraction: function (event) {
return !!$(event.target).is(".select2-input") || this._super(event);
} \t \t
});
\t
$('#someList').select2({
data: [
{ id: 0, text: 'enhancement' },
{ id: 1, text: 'bug' },
{ id: 2, text: 'duplicate' },
{ id: 3, text: 'invalid' },
{ id: 4, text: 'wontfix' }
]
});
<link href="http://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css" rel="stylesheet"/>
<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="http://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js"></script>
<button data-bind="click: showTeam">Add Team</button>
<div id="addTeamDialog">
<fieldset data-bind="with: department">
<div class="lite-dialog-field">
<div class="label">
<span data-bind="text: name"></span>
</div>
<div class="field">
<input type="hidden" id="someList" />
</div>
</div>
</fieldset>
</div>
Loại bỏ các data-bind
trên fieldset
và Select2 hoạt động tốt.
Khi data-bind
trên fieldset
được đặt thành department
select2 hoạt động tốt.
Khi data-bind
trên fieldset
được đặt thành department.selectedTeam
select2 không hoạt động.
Mã bạn đã đăng không hoàn toàn dường như là đủ để tái tạo kịch bản của bạn (ví dụ không có 'select's hoặc mã có liên quan của bất cứ loại nào?). – Jeroen
Điều gì mang lại? Đầu vào bị ẩn trên đánh dấu với id someList là vùng chứa cho điều khiển select2. Trong phần thiết lập, bạn có thể thấy tôi gọi $ ('# someList'). Select2 ({..}). Điều này chuyển đổi phần tử này thành danh sách select2. Tui bỏ lỡ điều gì vậy? Downvote khắc nghiệt .... –
Tôi đã sửa chữa. Xin lỗi. - Tôi đã chỉnh sửa câu hỏi của bạn một chút, nếu không hệ thống sẽ không cho phép tôi hoàn tác phiếu bầu của mình. Tôi cũng đã rút lại cuộc bầu cử gần như bây giờ tôi thấy không đủ nỗ lực để sử dụng mã được đăng để repro vấn đề (mặc dù tôi vẫn không chắc chắn 100% cách làm như vậy, nhưng những người khác có thể thấy mọi thứ rõ ràng hơn có thể giúp đỡ). – Jeroen