From 90e5d3ea739834fca9937bea0935590215eefa85 Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Thu, 24 Sep 2015 17:13:34 -0700 Subject: [PATCH] Avoid invalidation setting absent key to undefined Fixes a test-breaking aspect of 60aa9f7, which is that while it made setting an absent value to "undefined" work, doing so would cause an invalidation that didn't happen before. While we're at it, clean up the code and make sure that setting an absent key to 'undefined' does invalidate "all()". Unit tests in "session" and "reactive-dict" now pass. --- packages/reactive-dict/reactive-dict-tests.js | 4 +++ packages/reactive-dict/reactive-dict.js | 25 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/reactive-dict/reactive-dict-tests.js b/packages/reactive-dict/reactive-dict-tests.js index 62fc38f5c7..1ef8ebb7da 100644 --- a/packages/reactive-dict/reactive-dict-tests.js +++ b/packages/reactive-dict/reactive-dict-tests.js @@ -29,6 +29,10 @@ Tinytest.add('ReactiveDict - all() works', function (test) { dict.set('foo', 'bar'); Tracker.flush(); test.equal(all, {foo: 'bar'}); + + dict.set('blah', undefined); + Tracker.flush(); + test.equal(all, {foo: 'bar', blah: undefined}); }); diff --git a/packages/reactive-dict/reactive-dict.js b/packages/reactive-dict/reactive-dict.js index e4a0a5c71b..d2b54b7c21 100644 --- a/packages/reactive-dict/reactive-dict.js +++ b/packages/reactive-dict/reactive-dict.js @@ -60,19 +60,22 @@ _.extend(ReactiveDict.prototype, { value = stringify(value); - var oldSerializedValue = 'undefined'; - if (_.has(self.keys, key)) { - oldSerializedValue = self.keys[key]; - if (value === oldSerializedValue) - return; - } + var keyExisted = _.has(self.keys, key); + var oldSerializedValue = keyExisted ? self.keys[key] : 'undefined'; + var isNewValue = (value !== oldSerializedValue); + self.keys[key] = value; - self.allDeps.changed(); - changed(self.keyDeps[key]); - if (self.keyValueDeps[key]) { - changed(self.keyValueDeps[key][oldSerializedValue]); - changed(self.keyValueDeps[key][value]); + if (isNewValue || !keyExisted) { + self.allDeps.changed(); + } + + if (isNewValue) { + changed(self.keyDeps[key]); + if (self.keyValueDeps[key]) { + changed(self.keyValueDeps[key][oldSerializedValue]); + changed(self.keyValueDeps[key][value]); + } } },