单击 returns 时检查的绑定不起作用 false
Checked binding not working when click returns false
我在选中和点击绑定时遇到问题。
我想要有用于选择多行的检查列表框,并且我希望能够拒绝取消选择最后一个值。
我能得到的最好的是this。
有问题,当我单击最后一个复选框时它不会取消选择,但选中的绑定仍会从数组中删除最后一个值。
请帮助解决任何问题。
HTML:
<div id="bookingResources" class="listcontrol">
<!-- ko foreach:resources -->
<div class="li" data-bind="css:{ 'selected':$root.isResourceSelected($data) }">
<a href="#" data-bind="click:$root.selectResource">
<span data-bind="text:Name"></span>
<input class="right" type="checkbox" data-bind="click:$root.checkboxClick, clickBubble:false, value:Id, checked:$root.resourceIds"/>
</a>
</div>
<!-- /ko -->
</div>
JS:
var model = function(){
var self = this;
self.resources = [{"Id":4612,"Name":"John"},{"Id":4613,"Name":"Tom"},{"Id":4614,"Name":"Marty"}];
self.resourceIds = ko.observableArray([4612]);
self.isResourceSelected = function(resource) {
return self.resourceIds.indexOf(resource.Id) >= 0;
}
self.selectResource = function (resource) {
if (self.isResourceSelected(resource)) {
if (self.resourceIds().length > 1) { // the last not remove
self.resourceIds.remove(resource.Id);
}
} else {
self.resourceIds.push(resource.Id);
}
}
self.checkboxClick = function(resource) {
if (self.resourceIds().length != 1)
return true;
return self.resourceIds()[0] != resource.Id;
}
//subscribe
self.resourceIds.subscribe(function(newValue) {
console.log("Selected resorces (" + newValue.length + "): " + newValue);
});
}
ko.applyBindings(new model(), document.getElementById("bookingResources"))
好的,我查了一下checked绑定的knockout源码,发现,就是简单的绑定点击事件HERE。
所以我只需要 jquery 来停止复选框元素上的 eventPropagation。
调用 event.stopimmediatepropagation()
应该可以完成工作。
一起我可以停止事件传播,因此已检查的绑定将不会处理当前点击:
self.checkboxClick = function(resource, event) {
if (self.resourceIds().length != 1)
return true;
if(self.resourceIds()[0] == resource.Id)
{
event.stopImmediatePropagation();
return false;
}
return true;
}
我在选中和点击绑定时遇到问题。
我想要有用于选择多行的检查列表框,并且我希望能够拒绝取消选择最后一个值。
我能得到的最好的是this。
有问题,当我单击最后一个复选框时它不会取消选择,但选中的绑定仍会从数组中删除最后一个值。
请帮助解决任何问题。
HTML:
<div id="bookingResources" class="listcontrol">
<!-- ko foreach:resources -->
<div class="li" data-bind="css:{ 'selected':$root.isResourceSelected($data) }">
<a href="#" data-bind="click:$root.selectResource">
<span data-bind="text:Name"></span>
<input class="right" type="checkbox" data-bind="click:$root.checkboxClick, clickBubble:false, value:Id, checked:$root.resourceIds"/>
</a>
</div>
<!-- /ko -->
</div>
JS:
var model = function(){
var self = this;
self.resources = [{"Id":4612,"Name":"John"},{"Id":4613,"Name":"Tom"},{"Id":4614,"Name":"Marty"}];
self.resourceIds = ko.observableArray([4612]);
self.isResourceSelected = function(resource) {
return self.resourceIds.indexOf(resource.Id) >= 0;
}
self.selectResource = function (resource) {
if (self.isResourceSelected(resource)) {
if (self.resourceIds().length > 1) { // the last not remove
self.resourceIds.remove(resource.Id);
}
} else {
self.resourceIds.push(resource.Id);
}
}
self.checkboxClick = function(resource) {
if (self.resourceIds().length != 1)
return true;
return self.resourceIds()[0] != resource.Id;
}
//subscribe
self.resourceIds.subscribe(function(newValue) {
console.log("Selected resorces (" + newValue.length + "): " + newValue);
});
}
ko.applyBindings(new model(), document.getElementById("bookingResources"))
好的,我查了一下checked绑定的knockout源码,发现,就是简单的绑定点击事件HERE。
所以我只需要 jquery 来停止复选框元素上的 eventPropagation。
调用 event.stopimmediatepropagation()
应该可以完成工作。
一起我可以停止事件传播,因此已检查的绑定将不会处理当前点击:
self.checkboxClick = function(resource, event) {
if (self.resourceIds().length != 1)
return true;
if(self.resourceIds()[0] == resource.Id)
{
event.stopImmediatePropagation();
return false;
}
return true;
}