Fixed issue with nested observables when null is given as property value.

This commit is contained in:
Nedyalko Nikolov
2016-08-30 12:37:06 +03:00
parent 501c357fca
commit cb9d974fba
2 changed files with 20 additions and 13 deletions

View File

@ -534,4 +534,11 @@ export function test_NestedObservablesWithObservableArrayShouldNotCrash() {
secondProp: someObservableArray secondProp: someObservableArray
}); });
TKUnit.assert(testObservable !== undefined); TKUnit.assert(testObservable !== undefined);
}
export function test_NestedObservableWithNullShouldNotCrash() {
let testObservable = observable.fromObjectRecursive({
someProperty: null
});
TKUnit.assert(testObservable !== undefined);
} }

View File

@ -51,9 +51,9 @@ export class Observable implements definition.Observable {
private _observers = {}; private _observers = {};
constructor(json?: any) { constructor(source?: any) {
if (json) { if (source) {
addPropertiesFromJSON(this, json); 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; let isRecursive = recursive || false;
observable._map = new Map<string, Object>(); observable._map = new Map<string, Object>();
for (var prop in json) { for (let prop in source) {
if (json.hasOwnProperty(prop)) { if (source.hasOwnProperty(prop)) {
if (isRecursive) { if (isRecursive) {
if (!Array.isArray(json[prop]) && typeof json[prop] === 'object' && types.getClass(json[prop]) !== 'ObservableArray') { if (!Array.isArray(source[prop]) && source[prop] && typeof source[prop] === 'object' && types.getClass(source[prop]) !== 'ObservableArray') {
json[prop] = fromObjectRecursive(json[prop]); source[prop] = fromObjectRecursive(source[prop]);
} }
} }
observable._defineNewProperty(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(); let observable = new Observable();
addPropertiesFromJSON(observable, json, false); addPropertiesFromObject(observable, source, false);
return observable; return observable;
} }
export function fromObjectRecursive(json: any): Observable { export function fromObjectRecursive(source: any): Observable {
let observable = new Observable(); let observable = new Observable();
addPropertiesFromJSON(observable, json, true); addPropertiesFromObject(observable, source, true);
return observable; return observable;
} }