From 7acc9701f13d410398d2ace2e169945a44d6d3fb Mon Sep 17 00:00:00 2001 From: Devin Weaver Date: Wed, 16 Dec 2020 10:34:28 -0500 Subject: [PATCH] Add deleteProperty to TrackedObject Allows to do `delete this.myTrackedObject.foo` or `Object.deleteProperty(this.myTrackedObject, 'foo')`. --- addon/-private/object.js | 11 +++++++++++ tests/unit/object-test.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/addon/-private/object.js b/addon/-private/object.js index 8c4cc00..2fdf8c5 100644 --- a/addon/-private/object.js +++ b/addon/-private/object.js @@ -50,6 +50,17 @@ const proxyHandler = { return true; }, + deleteProperty(target, prop, receiver) { + if (!(prop in target)) { return; } + + delete target[prop]; + + dirtyKey(target, COLLECTION); + + // We need to notify this way to make {{each-in}} update + notifyPropertyChange(receiver, '_SOME_PROP_'); + }, + getPrototypeOf() { return TrackedObject.prototype; }, diff --git a/tests/unit/object-test.js b/tests/unit/object-test.js index a84320c..139764f 100644 --- a/tests/unit/object-test.js +++ b/tests/unit/object-test.js @@ -148,4 +148,34 @@ module('TrackedObject', function (hooks) { } } ); + + reactivityTest( + 'Object.deleteProperty works', + class extends Component { + obj = new TrackedObject(); + + get value() { + return this.obj.foo; + } + + update() { + Object.deleteProperty(this.obj, 'foo'); + } + } + ); + + reactivityTest( + 'delete works', + class extends Component { + obj = new TrackedObject(); + + get value() { + return this.obj.foo; + } + + update() { + delete this.obj.foo; + } + } + ); });