diff --git a/apps/tests/observable-tests.ts b/apps/tests/observable-tests.ts index b0a29ddf4..1cbb6e702 100644 --- a/apps/tests/observable-tests.ts +++ b/apps/tests/observable-tests.ts @@ -478,4 +478,16 @@ export var test_ObservablesCreatedWithJSON_shouldNotInterfereWithOneAnother = fu TKUnit.wait(0.1); TKUnit.assert(propName2 === "property2", "propName2 should be 'property2'"); TKUnit.assert(newValue2 === 20, "newValue2 should be 20"); -}; \ No newline at end of file +}; + +export function test_ObservablesCreatedWithJSON_shouldNotEmitTwoTimesPropertyChangeEvent() { + var testObservable = new observable.Observable({ "property1": 1 }); + var propertyChangeCounter = 0; + var propertyChangeHandler = function (args) { + propertyChangeCounter++; + } + testObservable.on(observable.Observable.propertyChangeEvent, propertyChangeHandler); + testObservable.set("property1", 2); + + TKUnit.assertEqual(propertyChangeCounter, 1, "PropertyChange event should be fired only once for a single change."); +} \ No newline at end of file diff --git a/data/observable/observable.ts b/data/observable/observable.ts index e677fede6..f97302564 100644 --- a/data/observable/observable.ts +++ b/data/observable/observable.ts @@ -121,11 +121,19 @@ export class Observable implements definition.Observable { return this[name]; } + private disableNotifications = false; + public _setCore(data: definition.PropertyChangeData) { + this.disableNotifications = true; this[data.propertyName] = data.value; + this.disableNotifications = false; } public notify(data: T) { + if (this.disableNotifications) { + return; + } + var observers = this._getEventList(data.eventName); if (!observers) { return; @@ -134,7 +142,7 @@ export class Observable implements definition.Observable { var i; var entry: ListenerEntry; var observersLength = observers.length; - for (i = observersLength - 1; i >= 0 ; i--) { + for (i = observersLength - 1; i >= 0; i--) { entry = observers[i]; if (entry.thisArg) { entry.callback.apply(entry.thisArg, [data]);