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.
This commit is contained in:
David Greenspan
2015-09-24 17:13:34 -07:00
parent 7191dfcf3e
commit 90e5d3ea73
2 changed files with 18 additions and 11 deletions

View File

@@ -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});
});

View File

@@ -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]);
}
}
},