Skip to content

Commit 6a0530d

Browse files
committed
Fixes issue #247 copyValueTo on numeric fields
Changed setting with $viewValue to $modelValue
1 parent dfab380 commit 6a0530d

File tree

4 files changed

+92
-85
lines changed

4 files changed

+92
-85
lines changed

dist/schema-form.js

Lines changed: 76 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -51,81 +51,6 @@ angular.module('schemaForm').provider('sfPath',
5151
};
5252
}]);
5353

54-
/**
55-
* @ngdoc service
56-
* @name sfSelect
57-
* @kind function
58-
*
59-
*/
60-
angular.module('schemaForm').factory('sfSelect', ['sfPath', function(sfPath) {
61-
var numRe = /^\d+$/;
62-
63-
/**
64-
* @description
65-
* Utility method to access deep properties without
66-
* throwing errors when things are not defined.
67-
* Can also set a value in a deep structure, creating objects when missing
68-
* ex.
69-
* var foo = Select('address.contact.name',obj)
70-
* Select('address.contact.name',obj,'Leeroy')
71-
*
72-
* @param {string} projection A dot path to the property you want to get/set
73-
* @param {object} obj (optional) The object to project on, defaults to 'this'
74-
* @param {Any} valueToSet (opional) The value to set, if parts of the path of
75-
* the projection is missing empty objects will be created.
76-
* @returns {Any|undefined} returns the value at the end of the projection path
77-
* or undefined if there is none.
78-
*/
79-
return function(projection, obj, valueToSet) {
80-
if (!obj) {
81-
obj = this;
82-
}
83-
//Support [] array syntax
84-
var parts = typeof projection === 'string' ? sfPath.parse(projection) : projection;
85-
86-
if (typeof valueToSet !== 'undefined' && parts.length === 1) {
87-
//special case, just setting one variable
88-
obj[parts[0]] = valueToSet;
89-
return obj;
90-
}
91-
92-
if (typeof valueToSet !== 'undefined' &&
93-
typeof obj[parts[0]] === 'undefined') {
94-
// We need to look ahead to check if array is appropriate
95-
obj[parts[0]] = parts.length > 2 && numRe.test(parts[1]) ? [] : {};
96-
}
97-
98-
var value = obj[parts[0]];
99-
for (var i = 1; i < parts.length; i++) {
100-
// Special case: We allow JSON Form syntax for arrays using empty brackets
101-
// These will of course not work here so we exit if they are found.
102-
if (parts[i] === '') {
103-
return undefined;
104-
}
105-
if (typeof valueToSet !== 'undefined') {
106-
if (i === parts.length - 1) {
107-
//last step. Let's set the value
108-
value[parts[i]] = valueToSet;
109-
return valueToSet;
110-
} else {
111-
// Make sure to create new objects on the way if they are not there.
112-
// We need to look ahead to check if array is appropriate
113-
var tmp = value[parts[i]];
114-
if (typeof tmp === 'undefined' || tmp === null) {
115-
tmp = numRe.test(parts[i + 1]) ? [] : {};
116-
value[parts[i]] = tmp;
117-
}
118-
value = tmp;
119-
}
120-
} else if (value) {
121-
//Just get nex value.
122-
value = value[parts[i]];
123-
}
124-
}
125-
return value;
126-
};
127-
}]);
128-
12954
angular.module('schemaForm').provider('schemaFormDecorators',
13055
['$compileProvider', 'sfPathProvider', function($compileProvider, sfPathProvider) {
13156
var defaultDecorator = '';
@@ -898,6 +823,81 @@ angular.module('schemaForm').provider('schemaForm',
898823

899824
}]);
900825

826+
/**
827+
* @ngdoc service
828+
* @name sfSelect
829+
* @kind function
830+
*
831+
*/
832+
angular.module('schemaForm').factory('sfSelect', ['sfPath', function(sfPath) {
833+
var numRe = /^\d+$/;
834+
835+
/**
836+
* @description
837+
* Utility method to access deep properties without
838+
* throwing errors when things are not defined.
839+
* Can also set a value in a deep structure, creating objects when missing
840+
* ex.
841+
* var foo = Select('address.contact.name',obj)
842+
* Select('address.contact.name',obj,'Leeroy')
843+
*
844+
* @param {string} projection A dot path to the property you want to get/set
845+
* @param {object} obj (optional) The object to project on, defaults to 'this'
846+
* @param {Any} valueToSet (opional) The value to set, if parts of the path of
847+
* the projection is missing empty objects will be created.
848+
* @returns {Any|undefined} returns the value at the end of the projection path
849+
* or undefined if there is none.
850+
*/
851+
return function(projection, obj, valueToSet) {
852+
if (!obj) {
853+
obj = this;
854+
}
855+
//Support [] array syntax
856+
var parts = typeof projection === 'string' ? sfPath.parse(projection) : projection;
857+
858+
if (typeof valueToSet !== 'undefined' && parts.length === 1) {
859+
//special case, just setting one variable
860+
obj[parts[0]] = valueToSet;
861+
return obj;
862+
}
863+
864+
if (typeof valueToSet !== 'undefined' &&
865+
typeof obj[parts[0]] === 'undefined') {
866+
// We need to look ahead to check if array is appropriate
867+
obj[parts[0]] = parts.length > 2 && numRe.test(parts[1]) ? [] : {};
868+
}
869+
870+
var value = obj[parts[0]];
871+
for (var i = 1; i < parts.length; i++) {
872+
// Special case: We allow JSON Form syntax for arrays using empty brackets
873+
// These will of course not work here so we exit if they are found.
874+
if (parts[i] === '') {
875+
return undefined;
876+
}
877+
if (typeof valueToSet !== 'undefined') {
878+
if (i === parts.length - 1) {
879+
//last step. Let's set the value
880+
value[parts[i]] = valueToSet;
881+
return valueToSet;
882+
} else {
883+
// Make sure to create new objects on the way if they are not there.
884+
// We need to look ahead to check if array is appropriate
885+
var tmp = value[parts[i]];
886+
if (typeof tmp === 'undefined' || tmp === null) {
887+
tmp = numRe.test(parts[i + 1]) ? [] : {};
888+
value[parts[i]] = tmp;
889+
}
890+
value = tmp;
891+
}
892+
} else if (value) {
893+
//Just get nex value.
894+
value = value[parts[i]];
895+
}
896+
}
897+
return value;
898+
};
899+
}]);
900+
901901
/* Common code for validating a value against its form and schema definition */
902902
/* global tv4 */
903903
angular.module('schemaForm').factory('sfValidator', [function() {
@@ -1401,12 +1401,11 @@ angular.module('schemaForm').directive('schemaValidate', ['sfValidator', 'sfSele
14011401
return form;
14021402
};
14031403
var form = getForm();
1404-
14051404
if (form.copyValueTo) {
14061405
ngModel.$viewChangeListeners.push(function() {
14071406
var paths = form.copyValueTo;
14081407
angular.forEach(paths, function(path) {
1409-
sfSelect(path, scope.model, ngModel.$viewValue);
1408+
sfSelect(path, scope.model, ngModel.$modelValue);
14101409
});
14111410
});
14121411
}

0 commit comments

Comments
 (0)