Skip to content

hasMany properties do not interact correctly with computed array properties #447

@mongoose700

Description

@mongoose700

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions