我在尝试使用KnockoutJS时具有jQuery selectable list的功能,但无法使其工作。
使用自定义绑定我成功地在可选择的元素中转换ul
元素,并为选定和未选择的事件创建事件处理程序。但是我将什么传递给维护所选元素的ViewModel函数?
到目前为止,我的代码是:http://jsfiddle.net/QCmJt/
我是这一切的新手,所以也许我正以错误的方式接近......
答案 0 :(得分:1)
这里有一些来自你的修改过的,也让它运行起来。它在数组中的每个项目上使用选定的属性,这是可观察的双向通信。如果您想要一个只是所选项目列表的属性,您可以始终创建一个依赖的observable,或者只是一个要过滤的方法。
创建了自定义绑定:
ko.bindingHandlers.selectableItem = {
init: function(element, valueAccessor, allBindingsAccessor) {
var selectable = $(element).parent();
selectable.bind('selectableselected', function(event, ui) {
if(ui.selected === element) {
var value = valueAccessor();
value(true);
}
});
selectable.bind('selectableunselected', function(event, ui) {
if(ui.unselected === element) {
var value = valueAccessor();
value(false);
}
});
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
var el = $(element);
if(valueAccessor()()) {
el.addClass('ui-selected');
} else {
el.removeClass('ui-selected');
}
}
};
它不仅仅是非常简单的双向绑定,而且应该很容易构建。
答案 1 :(得分:0)
好的,我找到了一种方法来传递绑定到所选项目的数据:
$(ui.selected).tmplItem().data
选择和时
取消选择时$(ui.selected).tmplItem().data
。
这里更新的小提琴:http://jsfiddle.net/8RnxC/
自定义绑定看起来像:
ko.bindingHandlers.selectable = {
init: function(element, valueAccessor) {
$(element).attr("id", "selectable").selectable({
selected: function(event, ui) {
vm.selectRequest($(ui.selected).tmplItem().data);
},
unselected: function(event, ui) {
vm.unselectRequest($(ui.unselected).tmplItem().data);
}
});
}
};
我的观点模型:
function viewModel() {
// Data
this.requests = ko.observableArray([]);
this.selectedRequests = ko.observableArray([]);
// Behaviours
this.selectRequest = function(request) {
this.name = "othername";
// Add to array if not already there.
if ($.inArray(request, this.selectedRequests()) === -1) {
this.selectedRequests().push(request);
}
var self = this;
};
this.unselectRequest = function(request) {
// Remove from the array.
this.selectedRequests().splice($.inArray(request, this.selectedRequests()), 1);
};
};