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