Skip to content

Commit

Permalink
Move computed fix to computed property set
Browse files Browse the repository at this point in the history
  • Loading branch information
richgt committed Aug 3, 2020
1 parent 6532c0d commit 01f7224
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 29 deletions.
29 changes: 0 additions & 29 deletions packages/@ember/-internals/glimmer/lib/component-managers/curly.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { privatize as P } from '@ember/-internals/container';
import { ENV } from '@ember/-internals/environment';
import { addObserver, descriptorForProperty, PROPERTY_DID_CHANGE } from '@ember/-internals/metal';
import { ComputedDescriptor } from '@ember/-internals/metal/lib/decorator';
import { getOwner } from '@ember/-internals/owner';
import { guidFor } from '@ember/-internals/utils';
import { addChildView, setElementView, setViewElement } from '@ember/-internals/views';
Expand Down Expand Up @@ -304,33 +302,6 @@ export default class CurlyComponentManager
}
}

// ensure two way binding works when the component has defined a computed
// property with both a setter and dependent keys, in that scenario without
// the sync observer added below the caller's value will never be updated
//
// See GH#18417 / GH#19028 for details.
let keyName: string, descriptor: ComputedDescriptor;
if (environment.isInteractive && capturedArgs.names.length > 0) {
for (let i = 0; i < capturedArgs.names.length; i++) {
keyName = capturedArgs.names[i];
descriptor = descriptorForProperty(component, keyName);

if (
descriptor !== undefined &&
descriptor._dependentKeys !== undefined &&
descriptor._dependentKeys.length > 0
) {
addObserver(
component,
keyName,
component[PROPERTY_DID_CHANGE].bind(component, keyName),
undefined,
true
);
}
}
}

// Track additional lifecycle metadata about this component in a state bucket.
// Essentially we're saving off all the state we'll need in the future.
let bucket = new ComponentStateBucket(
Expand Down
27 changes: 27 additions & 0 deletions packages/@ember/-internals/metal/lib/computed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import { defineProperty } from './properties';
import { beginPropertyChanges, endPropertyChanges, notifyPropertyChange } from './property_events';
import { set } from './property_set';
import { tagForProperty } from './tags';
import { addObserver, PROPERTY_DID_CHANGE } from '@ember/-internals/metal';

export type ComputedPropertyGetter = (keyName: string) => any;
export type ComputedPropertySetter = (keyName: string, value: any, cachedValue?: any) => any;
Expand Down Expand Up @@ -675,6 +676,32 @@ export class ComputedProperty extends ComputedDescriptor {
let ret;

try {
if (obj instanceof Ember.Component) {
// ensure two way binding works when the component has defined a computed
// property with both a setter and dependent keys, in that scenario without
// the sync observer added below the caller's value will never be updated
//
// See GH#18417 / GH#19028 for details.
let descriptor: ComputedDescriptor;
descriptor = descriptorForProperty(obj, keyName);
let meta = metaFor(obj);
if (
meta.isInitializing() &&
descriptor !== undefined &&
descriptor._dependentKeys !== undefined &&
descriptor._dependentKeys.length > 0
) {
addObserver(
obj,
keyName,
obj[PROPERTY_DID_CHANGE].bind(obj, keyName),
undefined,
true
);
}
}


beginPropertyChanges();

ret = this._set(obj, keyName, value);
Expand Down

0 comments on commit 01f7224

Please sign in to comment.