Merge pull request #970 from NativeScript/nnikolov/Issue966

Fixed two propertyChange event notifications.
This commit is contained in:
Nedyalko Nikolov
2015-10-21 16:39:38 +03:00
2 changed files with 22 additions and 2 deletions

View File

@ -478,4 +478,16 @@ export var test_ObservablesCreatedWithJSON_shouldNotInterfereWithOneAnother = fu
TKUnit.wait(0.1); TKUnit.wait(0.1);
TKUnit.assert(propName2 === "property2", "propName2 should be 'property2'"); TKUnit.assert(propName2 === "property2", "propName2 should be 'property2'");
TKUnit.assert(newValue2 === 20, "newValue2 should be 20"); TKUnit.assert(newValue2 === 20, "newValue2 should be 20");
}; };
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.");
}

View File

@ -121,11 +121,19 @@ export class Observable implements definition.Observable {
return this[name]; return this[name];
} }
private disableNotifications = false;
public _setCore(data: definition.PropertyChangeData) { public _setCore(data: definition.PropertyChangeData) {
this.disableNotifications = true;
this[data.propertyName] = data.value; this[data.propertyName] = data.value;
this.disableNotifications = false;
} }
public notify<T extends definition.EventData>(data: T) { public notify<T extends definition.EventData>(data: T) {
if (this.disableNotifications) {
return;
}
var observers = this._getEventList(data.eventName); var observers = this._getEventList(data.eventName);
if (!observers) { if (!observers) {
return; return;
@ -134,7 +142,7 @@ export class Observable implements definition.Observable {
var i; var i;
var entry: ListenerEntry; var entry: ListenerEntry;
var observersLength = observers.length; var observersLength = observers.length;
for (i = observersLength - 1; i >= 0 ; i--) { for (i = observersLength - 1; i >= 0; i--) {
entry = observers[i]; entry = observers[i];
if (entry.thisArg) { if (entry.thisArg) {
entry.callback.apply(entry.thisArg, [data]); entry.callback.apply(entry.thisArg, [data]);