pureComputed and arrayChange

50 views
Skip to first unread message

Glenn

unread,
Apr 23, 2015, 4:45:47 PM4/23/15
to knock...@googlegroups.com
If I have a pureComputed based on an observableArray, should the arrayChange fire on update?

In my model I have:

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
})

I am using a modified version of bootstrap-multiselect that has the following:

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?

Glenn

unread,
Apr 24, 2015, 9:37:47 AM4/24/15
to knock...@googlegroups.com
Update:

I added .extend({trackArrayChanges: true}); to the purComputed and the arrayChange event now fires.
Reply all
Reply to author
Forward
0 new messages