diff --git a/tests/app/ui/bindable-tests.ts b/tests/app/ui/bindable-tests.ts index 219d5eaae..841c9b4c2 100644 --- a/tests/app/ui/bindable-tests.ts +++ b/tests/app/ui/bindable-tests.ts @@ -1261,4 +1261,46 @@ export function test_only_Bindable_BindingContext_Null_DoesNotThrow() { obj.bind(options); obj.bindingContext = new observable.Observable({ a: "b" }); obj.bindingContext = null; +} + +export function test_Observable_from_nested_json_binds_correctly() { + let expectedValue = "Test"; + var model = new observable.Observable({ + "firstObject": { + "secondObject": { + "dummyProperty": "text" + } + } + }); + + var obj = new bindable.Bindable(); + obj.bind({ + sourceProperty: "firstObject.secondObject.dummyProperty", + targetProperty: "test" + }, model); + + model.get("firstObject").get("secondObject").set("dummyProperty", expectedValue); + + TKUnit.assertEqual(obj.get("test"), expectedValue); +} + +export function test_Observable_from_nested_json_binds_correctly_when_upper_object_is_changed() { + let expectedValue = "Test"; + var model = new observable.Observable({ + "firstObject": { + "secondObject": { + "dummyProperty": "text" + } + } + }); + + var obj = new bindable.Bindable(); + obj.bind({ + sourceProperty: "firstObject.secondObject.dummyProperty", + targetProperty: "test" + }, model); + + model.get("firstObject").set("secondObject", new observable.Observable({"dummyProperty": expectedValue})); + + TKUnit.assertEqual(obj.get("test"), expectedValue); } \ 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 1a144680c..1ad93a2f2 100644 --- a/tns-core-modules/data/observable/observable.ts +++ b/tns-core-modules/data/observable/observable.ts @@ -56,6 +56,9 @@ export class Observable implements definition.Observable { this._map = new Map(); for (var prop in json) { if (json.hasOwnProperty(prop)) { + if (!Array.isArray(json[prop]) && typeof json[prop] === 'object') { + json[prop] = new Observable(json[prop]); + } this._defineNewProperty(prop); this.set(prop, json[prop]); }