diff --git a/addon/-private/object.js b/addon/-private/object.js index ffaa1c4..a66a299 100644 --- a/addon/-private/object.js +++ b/addon/-private/object.js @@ -45,7 +45,17 @@ export default class TrackedObject { target[prop] = value; self.#dirtyStorageFor(prop); - setValue(self.#collection, null); + self.#dirtyCollection(); + + return true; + }, + + deleteProperty(target, prop) { + if (prop in target) { + delete target[prop]; + self.#dirtyStorageFor(prop); + self.#dirtyCollection(); + } return true; }, @@ -56,13 +66,10 @@ export default class TrackedObject { }); } - // @private #storages = new Map(); - // @private #collection = createStorage(null, () => false); - // @private #readStorageFor(key) { let storage = this.#storages.get(key); @@ -74,7 +81,6 @@ export default class TrackedObject { getValue(storage); } - // @private #dirtyStorageFor(key) { const storage = this.#storages.get(key); @@ -82,4 +88,8 @@ export default class TrackedObject { setValue(storage, null); } } + + #dirtyCollection() { + setValue(this.#collection, null); + } } diff --git a/tests/unit/object-test.ts b/tests/unit/object-test.ts index 59df68d..5e637e3 100644 --- a/tests/unit/object-test.ts +++ b/tests/unit/object-test.ts @@ -165,4 +165,19 @@ module('TrackedObject', function (hooks) { } } ); + + reactivityTest( + 'delete works', + class extends Component { + obj: { foo?: number } = new TrackedObject({ foo: 1 }); + + get value() { + return this.obj.foo; + } + + update() { + delete this.obj.foo; + } + } + ); });