Merge pull request #2620 from NativeScript/nnikolov/ChangeNestedObservablesFunctions

Renamed and moved to module Observable creation functions.
This commit is contained in:
Nedyalko Nikolov
2016-08-25 09:15:11 +03:00
committed by GitHub
4 changed files with 48 additions and 46 deletions

View File

@ -529,7 +529,7 @@ export function test_CorrectPropertyValueAfterUsingWrappedValue() {
export function test_NestedObservablesWithObservableArrayShouldNotCrash() { export function test_NestedObservablesWithObservableArrayShouldNotCrash() {
let someObservableArray = new ObservableArray<any>(); let someObservableArray = new ObservableArray<any>();
let testObservable = observable.Observable.fromJSONRecursive({ let testObservable = observable.fromObjectRecursive({
firstProp: "test string", firstProp: "test string",
secondProp: someObservableArray secondProp: someObservableArray
}); });

View File

@ -1265,7 +1265,7 @@ export function test_only_Bindable_BindingContext_Null_DoesNotThrow() {
export function test_Observable_from_nested_json_binds_correctly() { export function test_Observable_from_nested_json_binds_correctly() {
let expectedValue = "Test"; let expectedValue = "Test";
let model = observable.Observable.fromJSONRecursive({ let model = observable.fromObjectRecursive({
"firstObject": { "firstObject": {
"secondObject": { "secondObject": {
"dummyProperty": "text" "dummyProperty": "text"
@ -1286,7 +1286,7 @@ export function test_Observable_from_nested_json_binds_correctly() {
export function test_Observable_from_nested_json_binds_correctly_when_upper_object_is_changed() { export function test_Observable_from_nested_json_binds_correctly_when_upper_object_is_changed() {
let expectedValue = "Test"; let expectedValue = "Test";
let model = observable.Observable.fromJSONRecursive({ let model = observable.fromObjectRecursive({
"firstObject": { "firstObject": {
"secondObject": { "secondObject": {
"dummyProperty": "text" "dummyProperty": "text"
@ -1320,7 +1320,7 @@ export function test_BindingToBindingContextProperty_ShouldUseNewContext() {
targetProperty: 'text' targetProperty: 'text'
}); });
let testBindingContext = observable.Observable.fromJSONRecursive({ let testBindingContext = observable.fromObjectRecursive({
context: { context: {
text: 'Alabala' text: 'Alabala'
} }

View File

@ -70,17 +70,6 @@ declare module "data/observable" {
*/ */
public static propertyChangeEvent: string; public static propertyChangeEvent: string;
/**
* Creates an Observable instance and sets its properties according to the supplied JSON object.
*/
public static fromJSON(json: any): Observable;
/**
* Creates an Observable instance and sets its properties according to the supplied JSON object.
* This function will create new Observable for each nested object (expect arrays and functions) from supplied JSON.
*/
public static fromJSONRecursive(json: any): Observable;
/** /**
* [Deprecated please use static functions fromJSON or fromJSONRecursive instead] Creates an Observable instance and sets its properties according to the supplied JSON object. * [Deprecated please use static functions fromJSON or fromJSONRecursive instead] Creates an Observable instance and sets its properties according to the supplied JSON object.
*/ */
@ -161,4 +150,17 @@ declare module "data/observable" {
_emit(eventNames: string); _emit(eventNames: string);
//@endprivate //@endprivate
} }
/**
* Creates an Observable instance and sets its properties according to the supplied JavaScript object.
* param obj - A JavaScript object used to initialize nativescript Observable instance.
*/
export function fromObject(obj: any): Observable;
/**
* Creates an Observable instance and sets its properties according to the supplied JavaScript object.
* This function will create new Observable for each nested object (expect arrays and functions) from supplied JavaScript object.
* param obj - A JavaScript object used to initialize nativescript Observable instance.
*/
export function fromObjectRecursive(obj: any): Observable;
} }

View File

@ -47,45 +47,17 @@ var _wrappedValues = [
export class Observable implements definition.Observable { export class Observable implements definition.Observable {
public static propertyChangeEvent = "propertyChange"; public static propertyChangeEvent = "propertyChange";
private _map: Map<string, Object>; _map: Map<string, Object>;
private _observers = {}; private _observers = {};
public static fromJSON(json: any): Observable {
let observable = new Observable();
observable.addPropertiesFromJSON(observable, json, false);
return observable;
}
public static fromJSONRecursive(json: any): Observable {
let observable = new Observable();
observable.addPropertiesFromJSON(observable, json, true);
return observable;
}
private addPropertiesFromJSON(observable: Observable, json: any, recursive?: boolean) {
let isRecursive = recursive || false;
observable._map = new Map<string, Object>();
for (var prop in json) {
if (json.hasOwnProperty(prop)) {
if (isRecursive) {
if (!Array.isArray(json[prop]) && typeof json[prop] === 'object' && types.getClass(json[prop]) !== 'ObservableArray') {
json[prop] = Observable.fromJSONRecursive(json[prop]);
}
}
observable._defineNewProperty(prop);
observable.set(prop, json[prop]);
}
}
}
constructor(json?: any) { constructor(json?: any) {
if (json) { if (json) {
this.addPropertiesFromJSON(this, json); addPropertiesFromJSON(this, json);
} }
} }
private _defineNewProperty(propertyName: string): void { _defineNewProperty(propertyName: string): void {
Object.defineProperty(this, propertyName, { Object.defineProperty(this, propertyName, {
get: function () { get: function () {
return this._map.get(propertyName); return this._map.get(propertyName);
@ -276,3 +248,31 @@ export class Observable implements definition.Observable {
return this.typeName; return this.typeName;
} }
} }
function addPropertiesFromJSON(observable: Observable, json: any, recursive?: boolean) {
let isRecursive = recursive || false;
observable._map = new Map<string, Object>();
for (var prop in json) {
if (json.hasOwnProperty(prop)) {
if (isRecursive) {
if (!Array.isArray(json[prop]) && typeof json[prop] === 'object' && types.getClass(json[prop]) !== 'ObservableArray') {
json[prop] = fromObjectRecursive(json[prop]);
}
}
observable._defineNewProperty(prop);
observable.set(prop, json[prop]);
}
}
}
export function fromObject(json: any): Observable {
let observable = new Observable();
addPropertiesFromJSON(observable, json, false);
return observable;
}
export function fromObjectRecursive(json: any): Observable {
let observable = new Observable();
addPropertiesFromJSON(observable, json, true);
return observable;
}