Ich benutze Knockout, um ein observableArray basierend auf den geprüften Werten eines separaten ObservableArray zu füllen. Ich kann die $ Daten in den zweiten Satz kopieren, aber nur eine Eigenschaft kommt durch. Ich hätte gerne das gesamte Objekt zur Verfügung. Ist das ein Zuordnungsproblem oder etwas mit den Bindungen?Knockout observableArray aktualisiert nicht alle Eigenschaften für checked Wert
HTML:
<form role="form" data-bind="foreach: Colors">
<input type="checkbox" data-bind="checkedValue: name, click: $root.ToggleAssociation, checked: $root.ColorChoice">
<label data-bind="attr: {'for' : name}, text: id() + ' ' + name()"></label>
</form>
<div data-bind="foreach: ColorChoice">
<span data-bind="text: $rawData.Id, style: { 'background-color': $rawData.Name }"></span>
</div>
JavaScript:
function Color(data) {
var self = this;
self.id = ko.observable(data.id);
self.name = ko.observable(data.name);
self.selected = ko.observable(false);
}
function viewModel() {
var self = this;
self.Colors = ko.observableArray([]);
self.ColorChoice = ko.observableArray();
self.Id = ko.observable();
self.Color = ko.observable();
self.init = function() {
self.Colors.push(new Color({ id: 1, name: 'Red' }));
self.Colors.push(new Color({ id: 2, name: 'Orange' }));
self.Colors.push(new Color({ id: 3, name: 'Yellow' }));
self.Colors.push(new Color({ id: 4, name: 'Green' }));
self.Colors.push(new Color({ id: 5, name: 'Blue' }));
self.Colors.push(new Color({ id: 6, name: 'Purple' }));
}
self.ToggleAssociation = function (item) {
if (item.selected() === true)
console.log("dissociate item " + item.id());
else
console.log("associate item " + item.id() + " " + item.name());
self.Id(item.id());
self.Color(item.name());
item.selected(!(item.selected()));
return true;
};
};
var vm = new viewModel();
ko.applyBindings(vm);
vm.init();
https://jsfiddle.net/Razzle/ff1945ye/
Nice - danke! Also überprüft die ko.utils.arrayFirst das sekundäre Array, ob das Objekt übereinstimmt? – Razzle
'ko.utils.arrayFirst' führt eine Funktion für jedes Element im Array aus und gibt das erste Element zurück, bei dem die Funktion 'wahr' ergibt. Wir durchlaufen das Haupt-Array und was auch immer zu dem ausgewählten Element passt, schieben wir in das zweite Array und wenn es nicht ausgewählt ist, entfernen wir es daraus. –
Verstanden! Danke noch einmal. – Razzle