Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit 2e3aaec

Browse files
committed
Allow CompoundObserver to report changes in value from added to open
R=arv BUG= Review URL: https://codereview.appspot.com/88160051
1 parent fdc0da7 commit 2e3aaec

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed

src/observe.js

+25-16
Original file line numberDiff line numberDiff line change
@@ -875,9 +875,10 @@
875875
}
876876
});
877877

878-
function CompoundObserver() {
878+
function CompoundObserver(reportChangesOnOpen) {
879879
Observer.call(this);
880880

881+
this.reportChangesOnOpen_ = reportChangesOnOpen;
881882
this.value_ = [];
882883
this.directObserver_ = undefined;
883884
this.observed_ = [];
@@ -889,23 +890,22 @@
889890
__proto__: Observer.prototype,
890891

891892
connect_: function() {
892-
this.check_(undefined, true);
893-
894-
if (!hasObserve)
895-
return;
896-
897-
var object;
898-
var needsDirectObserver = false;
899-
for (var i = 0; i < this.observed_.length; i += 2) {
900-
object = this.observed_[i]
901-
if (object !== observerSentinel) {
902-
needsDirectObserver = true;
903-
break;
893+
if (hasObserve) {
894+
var object;
895+
var needsDirectObserver = false;
896+
for (var i = 0; i < this.observed_.length; i += 2) {
897+
object = this.observed_[i]
898+
if (object !== observerSentinel) {
899+
needsDirectObserver = true;
900+
break;
901+
}
904902
}
903+
904+
if (needsDirectObserver)
905+
this.directObserver_ = getObservedSet(this, object);
905906
}
906907

907-
if (needsDirectObserver)
908-
this.directObserver_ = getObservedSet(this, object);
908+
this.check_(undefined, !this.reportChangesOnOpen_);
909909
},
910910

911911
disconnect_: function() {
@@ -926,14 +926,23 @@
926926
if (this.state_ != UNOPENED && this.state_ != RESETTING)
927927
throw Error('Cannot add paths once started.');
928928

929-
this.observed_.push(object, getPath(path));
929+
var path = getPath(path);
930+
this.observed_.push(object, path);
931+
if (!this.reportChangesOnOpen_)
932+
return;
933+
var index = this.observed_.length / 2 - 1;
934+
this.value_[index] = path.getValueFrom(object);
930935
},
931936

932937
addObserver: function(observer) {
933938
if (this.state_ != UNOPENED && this.state_ != RESETTING)
934939
throw Error('Cannot add observers once started.');
935940

936941
this.observed_.push(observerSentinel, observer);
942+
if (!this.reportChangesOnOpen_)
943+
return;
944+
var index = this.observed_.length / 2 - 1;
945+
this.value_[index] = observer.open(this.deliver, this);
937946
},
938947

939948
startReset: function() {

tests/test.js

+27-4
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ function assertPathChanges(expectNewValue, expectOldValue, dontDeliver) {
7272
}
7373

7474
function assertCompoundPathChanges(expectNewValues, expectOldValues,
75-
expectObserved) {
76-
observer.deliver();
75+
expectObserved, dontDeliver) {
76+
if (!dontDeliver)
77+
observer.deliver();
7778

7879
assert.isTrue(callbackInvoked);
7980

@@ -84,8 +85,10 @@ function assertCompoundPathChanges(expectNewValues, expectOldValues,
8485
assert.deepEqual(expectOldValues, oldValues);
8586
assert.deepEqual(expectObserved, observed);
8687

87-
assert.isTrue(window.dirtyCheckCycleCount === undefined ||
88-
window.dirtyCheckCycleCount === 1);
88+
if (!dontDeliver) {
89+
assert.isTrue(window.dirtyCheckCycleCount === undefined ||
90+
window.dirtyCheckCycleCount === 1);
91+
}
8992

9093
callbackArgs = undefined;
9194
callbackInvoked = false;
@@ -1066,6 +1069,7 @@ suite('CompoundObserver Tests', function() {
10661069
observer.addPath(model, 'b');
10671070
observer.addPath(model, Path.get('c'));
10681071
observer.open(callback);
1072+
assertNoChanges();
10691073

10701074
var observerCallbackArg = [model, Path.get('a'),
10711075
model, Path.get('b'),
@@ -1102,6 +1106,25 @@ suite('CompoundObserver Tests', function() {
11021106
observer.close();
11031107
});
11041108

1109+
test('reportChangesOnOpen', function() {
1110+
var model = { a: 1, b: 2, c: 3 };
1111+
1112+
observer = new CompoundObserver(true);
1113+
observer.addPath(model, 'a');
1114+
observer.addPath(model, 'b');
1115+
observer.addPath(model, Path.get('c'));
1116+
1117+
model.a = -10;
1118+
model.b = 20;
1119+
observer.open(callback);
1120+
var observerCallbackArg = [model, Path.get('a'),
1121+
model, Path.get('b'),
1122+
model, Path.get('c')];
1123+
assertCompoundPathChanges([-10, 20, 3], [1, 2, ],
1124+
observerCallbackArg, true);
1125+
observer.close();
1126+
});
1127+
11051128
test('All Observers', function() {
11061129
function ident(value) { return value; }
11071130

0 commit comments

Comments
 (0)