vendredi 27 mars 2015

Knockout, select all checkboxes and view list of select checkboxes

I have a list with checkboxes, when I click at one of them, it is displayed in theSelectedUsers, works as it should, and checkboxes data-bind="checked: AllChecked" will checked too, but it should not be.



<div data-bind="foreach: SelectedUsers">
<p>
<span data-bind="text: userName" ></span>
</p>
</div>


But, when I use data-bind="checked: AllChecked", nothing is displayed in SelectedUsers, after that, when I click on some checkbox, all items are selected in the list and nothing is displayed in SelectedUsers


What's wrong? example: http://ift.tt/1FPZGuz



<div id="sideB">
<div data-bind="foreach: AllUsers">
<label>
<input type="checkbox" name="checkedUser" data-bind="value: userName, checked:$root.selectedUserNames" />
<span data-bind="text: userName" ></span>
</label>
</div>
Selected
<div data-bind="foreach: SelectedUsers">
<p>
<span data-bind="text: userName" ></span>
</p>
</div>
<label><input type="checkbox" data-bind="checked: AllChecked" />Check all</label>
</div>


Knockout-3.3.0:



function User(data) {
this.userName = ko.observable(data.userName);
this.selected = ko.observable(data.selected);

}

var dataSource = [new User({userName: "Bill", selected: false}),
new User({userName: "Andrii", selected: false})
];

function UsersViewModel() {
var self = this;
self.AllUsers = ko.observableArray(dataSource);
self.SelectedUsers = ko.observableArray([]);

self.selectedUserNames = ko.observableArray([]);

self.selectedUserNames.subscribe(function(newValue) {
var newSelectedUserNames = newValue;
var newSelectedUsers = [];
ko.utils.arrayForEach(newSelectedUserNames, function(userName) {
var selectedUser = ko.utils.arrayFirst(self.AllUsers(), function(user) {
return (user.userName() === userName);
});
newSelectedUsers.push(selectedUser);
});
self.SelectedUsers(newSelectedUsers);
});

self.AllChecked = ko.computed({
read: function() {
var firstUnchecked = ko.utils.arrayFirst(dataSource, function(item) {
return self.selectedUserNames() == false;
});
return firstUnchecked == null;
},
write: function(value) {
ko.utils.arrayForEach(dataSource, function(item) {
self.selectedUserNames(value);
});
}
})
}

ko.applyBindings(new UsersViewModel(), document.getElementById('sideB'));




Aucun commentaire:

Enregistrer un commentaire