ember-model
ember-model copied to clipboard
hasMany properties do not interact correctly with computed array properties
When you have a hasMany property, and define another property using as follows:
people: hasMany(Thing, { key: 'thing_ids' }),
peopleNames: Ember.computed.mapBy('people', 'name'),
then peopleNames will not update correctly when people changes. I've traced the issue to computedPropertySet in ember.js, where it performs the set
ret = setter.call(obj, keyName, value, cachedValue);
In ember-model.js, this ends up being
return existingArray.setObjects(newContentArray)
where existingArray is cachedValue and newContentArray is value. That is, it mutates the cached value and returns it, instead of returning a new, independent value. Thus, when computedPropertySet gets to
if (hadCachedValue && cachedValue === ret) {
return;
}
the comparison will be true, and it will return before getting to the logic to check if it is being watched and call propertyDidChange.