我想使用kickout.js将预定义状态应用于复选框 我已经尝试了很多东西,但是无法正常工作。
这是我的代码:
function DemoItem(id, name, state) {
var self = this;
self.id = ko.observable(id);
self.Name = ko.observable(name);
self.Selected = ko.observable(state);
}
function ViewModel() {
var self = this;
self.availableItems = ko.observableArray([]);
self.init = function() {
self.availableItems.push(new DemoItem(1, 'One', true));
self.availableItems.push(new DemoItem(2, 'Two', true));
self.availableItems.push(new DemoItem(3, 'Three', false));
self.availableItems.push(new DemoItem(4, 'Four', true));
self.availableItems.push(new DemoItem(5, 'Five', true));
};
self.relayState = ko.computed({
read: function() {
ko.utils.arrayForEach(self.availableItems, function(item) {
return item.Selected();
});
},
write: function(value) {
if (value) {
console.log("associate item ");
} else {
console.log("disasociate item ");
}
}
})
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
Available Items:
<div data-bind="foreach: $root.availableItems">
<input type="checkbox" data-bind="value: id(), checked: $root.relayState" />
<span data-bind="text: ' ' + Name()"></span>
<br/>
</div>
我无法获得复选框以最初应用预定义的值。
这是JSfiddle的链接:http://jsfiddle.net/w392rpxf/
答案 0 :(得分:0)
我不确定您要做什么,但这听起来像敲除的常规绑定应该可以解决。
您可以创建一个保存选择的observableArray
。 (取消)选中任何复选框会自动在此数组中添加或删除一个项目。
Selected
上的DemoItem
属性仅用于在init函数中填充其初始状态。
function DemoItem(id, name, state) {
var self = this;
self.id = ko.observable(id);
self.Name = ko.observable(name);
self.Selected = ko.observable(state);
}
function ViewModel() {
var self = this;
self.availableItems = ko.observableArray([]);
self.selectedItems = ko.observableArray([]);
// Log changes to the console
self.selectedItems.subscribe(function(sel) {
console.log("Selected are: " + sel.map(function(s) {
return s.Name();
}).join(", "));
});
self.init = function() {
self.availableItems([
new DemoItem(1, 'One', true),
new DemoItem(2, 'Two', true),
new DemoItem(3, 'Three', false),
new DemoItem(4, 'Four', true),
new DemoItem(5, 'Five', true)
]);
// Set up the initial state
self.selectedItems(
self.availableItems()
.filter(function(item) {
return item.Selected();
})
);
};
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Available Items:
<div data-bind="foreach: $root.availableItems">
<input type="checkbox" data-bind="checked: $root.selectedItems, checkedValue: $data" />
<span data-bind="text: ' ' + Name()"></span>
<br/>
</div>
编辑:由于您想知道哪个已更改,因此这是另一个示例:
function DemoItem(id, name, state, onChange) {
var self = this;
self.id = ko.observable(id);
self.Name = ko.observable(name);
self.Selected = ko.observable(state);
self.Selected.subscribe(function(newValue) {
onChange(self, newValue);
});
}
function ViewModel() {
var self = this;
self.availableItems = ko.observableArray([]);
self.selectedItems = ko.pureComputed(function() {
return self.availableItems().filter(function(demoItem) {
return demoItem.Selected();
});
});
// Log changes to the console
self.selectedItems.subscribe(function(sel) {
console.log("Selected are: " + sel.map(function(s) {
return s.Name();
}).join(", "));
});
// Log the individual that caused the change
self.onItemChange = function(item, newValue) {
console.log("The item that changed was " + item.Name() + " (" + newValue + ")");
};
self.init = function() {
self.availableItems([
new DemoItem(1, 'One', true, self.onItemChange),
new DemoItem(2, 'Two', true, self.onItemChange),
new DemoItem(3, 'Three', false, self.onItemChange),
new DemoItem(4, 'Four', true, self.onItemChange),
new DemoItem(5, 'Five', true, self.onItemChange)
]);
};
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Available Items:
<div data-bind="foreach: $root.availableItems">
<input type="checkbox" data-bind="checked: Selected" />
<span data-bind="text: ' ' + Name()"></span>
<br/>
</div>