ember-model icon indicating copy to clipboard operation
ember-model copied to clipboard

hasMany properties do not interact correctly with computed array properties

Open mongoose700 opened this issue 9 years ago • 0 comments

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.

mongoose700 avatar Oct 17 '16 20:10 mongoose700