From cb9d974fba476b0403679bb4db804e15ff750fa9 Mon Sep 17 00:00:00 2001 From: Nedyalko Nikolov Date: Tue, 30 Aug 2016 12:37:06 +0300 Subject: [PATCH] Fixed issue with nested observables when null is given as property value. --- tests/app/data/observable-tests.ts | 7 +++++ .../data/observable/observable.ts | 26 +++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/tests/app/data/observable-tests.ts b/tests/app/data/observable-tests.ts index 8c73b8302..d7fc4779d 100644 --- a/tests/app/data/observable-tests.ts +++ b/tests/app/data/observable-tests.ts @@ -534,4 +534,11 @@ export function test_NestedObservablesWithObservableArrayShouldNotCrash() { secondProp: someObservableArray }); TKUnit.assert(testObservable !== undefined); +} + +export function test_NestedObservableWithNullShouldNotCrash() { + let testObservable = observable.fromObjectRecursive({ + someProperty: null + }); + TKUnit.assert(testObservable !== undefined); } \ No newline at end of file diff --git a/tns-core-modules/data/observable/observable.ts b/tns-core-modules/data/observable/observable.ts index 6f63441f1..dcf6badac 100644 --- a/tns-core-modules/data/observable/observable.ts +++ b/tns-core-modules/data/observable/observable.ts @@ -51,9 +51,9 @@ export class Observable implements definition.Observable { private _observers = {}; - constructor(json?: any) { - if (json) { - addPropertiesFromJSON(this, json); + constructor(source?: any) { + if (source) { + addPropertiesFromObject(this, source); } } @@ -249,30 +249,30 @@ export class Observable implements definition.Observable { } } -function addPropertiesFromJSON(observable: Observable, json: any, recursive?: boolean) { +function addPropertiesFromObject(observable: Observable, source: any, recursive?: boolean) { let isRecursive = recursive || false; observable._map = new Map(); - for (var prop in json) { - if (json.hasOwnProperty(prop)) { + for (let prop in source) { + if (source.hasOwnProperty(prop)) { if (isRecursive) { - if (!Array.isArray(json[prop]) && typeof json[prop] === 'object' && types.getClass(json[prop]) !== 'ObservableArray') { - json[prop] = fromObjectRecursive(json[prop]); + if (!Array.isArray(source[prop]) && source[prop] && typeof source[prop] === 'object' && types.getClass(source[prop]) !== 'ObservableArray') { + source[prop] = fromObjectRecursive(source[prop]); } } observable._defineNewProperty(prop); - observable.set(prop, json[prop]); + observable.set(prop, source[prop]); } } } -export function fromObject(json: any): Observable { +export function fromObject(source: any): Observable { let observable = new Observable(); - addPropertiesFromJSON(observable, json, false); + addPropertiesFromObject(observable, source, false); return observable; } -export function fromObjectRecursive(json: any): Observable { +export function fromObjectRecursive(source: any): Observable { let observable = new Observable(); - addPropertiesFromJSON(observable, json, true); + addPropertiesFromObject(observable, source, true); return observable; }