If I have a pureComputed based on an observableArray, should the arrayChange fire on update?
SecurityRoles: ko.pureComputed({
read: function () {
var currentRoles = [];
if (model.Roles() && model.Roles().length) {
ko.utils.arrayForEach(model.Roles(), function (role) {
if (!role.EntityState || role.EntityState !== "DELETED") {
currentRoles.push(role.AppSecurityRoleCd);
}
});
}
return currentRoles;
},
write: function (valueArray) {
var valueInArray = false,
valueInArrayChanged = false;
ko.utils.arrayForEach(valueArray, function (value) {
// check to see if it had been deleted
ko.utils.arrayForEach(model.Roles(), function (role) {
if (role.AppSecurityRoleCd === value) {
if (role.EntityState && role.EntityState === "DELETED") {
if (role.RecordVersion) {
// was saved to database
role.EntityState = "UNCHANGED";
} else {
role.EntityState = "ADDED";
}
valueInArrayChanged = true;
}
valueInArray = true;
}
});
});
if (!valueInArray) {
model.Roles.push({
AppSecurityRoleCd: value,
EntityState: "ADDED"
});
};
if (valueInArrayChanged) {
model.Roles.valueHasMutated();
};
},
owner: model
})
listOfSelectedItems.subscribe(function (changes) {
var addedArray = [];
var deletedArray = [];
changes.forEach(function (change) {
if (change.moved === undefined) {
switch (change.status) {
case 'added':
addedArray.push(change.value);
break;
case 'deleted':
deletedArray.push(change.value);
break;
}
}
});
if (addedArray.length > 0) {
$(element).multiselect('select', addedArray);
};
if (deletedArray.length > 0) {
$(element).multiselect('deselect', deletedArray);
};
$(element).multiselect('buildDropdownOptions');
}, null, "arrayChange");
If I the listOfSelectedItems is an observableArray then it works, if it is based on a pureComputed which gets its values from an observable array, it doesn't.
Thoughts?