diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Angular.js | 3 | ||||
| -rw-r--r-- | src/Formaters.js | 6 | ||||
| -rw-r--r-- | src/Formatters.js | 14 | ||||
| -rw-r--r-- | src/Widgets.js | 37 |
4 files changed, 37 insertions, 23 deletions
diff --git a/src/Angular.js b/src/Angular.js index ce25423c..3c88c6b7 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -24,10 +24,11 @@ var consoleNode, msie, jQuery = window['jQuery'] || window['$'], // weirdness to make IE happy foreach = _.each, extend = _.extend, + identity = _.identity, angular = window['angular'] || (window['angular'] = {}), angularValidator = angular['validator'] || (angular['validator'] = {}), angularFilter = angular['filter'] || (angular['filter'] = {}), - angularFormater = angular['formater'] || (angular['formater'] = {}), + angularFormatter = angular['formatter'] || (angular['formatter'] = {}), angularCallbacks = angular['callbacks'] || (angular['callbacks'] = {}), angularAlert = angular['alert'] || (angular['alert'] = function(){ log(arguments); window.alert.apply(window, arguments); diff --git a/src/Formaters.js b/src/Formaters.js deleted file mode 100644 index e623d6b8..00000000 --- a/src/Formaters.js +++ /dev/null @@ -1,6 +0,0 @@ - -extend(angularFormater, { - 'noop':function(){ - - } -}); diff --git a/src/Formatters.js b/src/Formatters.js new file mode 100644 index 00000000..74126feb --- /dev/null +++ b/src/Formatters.js @@ -0,0 +1,14 @@ +function formater(format, parse) {return {'format':format, 'parse':parse};} +function toString(obj) {return ""+obj;}; +extend(angularFormatter, { + 'noop':formater(identity, identity), + 'boolean':formater(toString, toBoolean), + 'number':formater(toString, function(obj){return 1*obj;}), + + 'list':formater( + function(obj) { return obj ? obj.join(", ") : obj; }, + function(value) { + return value ? _(_(value.split(',')).map(jQuery.trim)).select(_.identity) : value; + } + ) +}); diff --git a/src/Widgets.js b/src/Widgets.js index d85c0ddc..d392d285 100644 --- a/src/Widgets.js +++ b/src/Widgets.js @@ -19,25 +19,26 @@ WidgetFactory.prototype = { if (exp) exp = exp.split(':').pop(); var event = "change"; var bubbleEvent = true; + var formatter = angularFormatter[input.attr('ng-format')] || angularFormatter['noop']; if (type == 'button' || type == 'submit' || type == 'reset' || type == 'image') { - controller = new ButtonController(input[0], exp); + controller = new ButtonController(input[0], exp, formatter); event = "click"; bubbleEvent = false; } else if (type == 'text' || type == 'textarea' || type == 'hidden' || type == 'password') { - controller = new TextController(input[0], exp); + controller = new TextController(input[0], exp, formatter); event = "keyup change"; } else if (type == 'checkbox') { - controller = new CheckboxController(input[0], exp); + controller = new CheckboxController(input[0], exp, formatter); event = "click"; } else if (type == 'radio') { - controller = new RadioController(input[0], exp); + controller = new RadioController(input[0], exp, formatter); event="click"; } else if (type == 'select-one') { - controller = new SelectController(input[0], exp); + controller = new SelectController(input[0], exp, formatter); } else if (type == 'select-multiple') { - controller = new MultiSelectController(input[0], exp); + controller = new MultiSelectController(input[0], exp, formatter); } else if (type == 'file') { - controller = this.createFileController(input, exp); + controller = this.createFileController(input, exp, formatter); } else { throw 'Unknown type: ' + type; } @@ -186,8 +187,9 @@ var ButtonController = NullController; /////////////////////// // TextController /////////////////////// -function TextController(view, exp) { +function TextController(view, exp, formatter) { this.view = view; + this.formatter = formatter; this.exp = exp; this.validator = view.getAttribute('ng-validate'); this.required = typeof view.attributes['ng-required'] != "undefined"; @@ -206,7 +208,7 @@ TextController.prototype = { if (this.lastValue === value) { return false; } else { - scope.setEval(this.exp, value); + scope.setEval(this.exp, this.formatter['parse'](value)); this.lastValue = value; return true; } @@ -214,10 +216,10 @@ TextController.prototype = { updateView: function(scope) { var view = this.view; - var value = scope.get(this.exp); + var value = this.formatter['format'](scope.get(this.exp)); if (typeof value === "undefined") { value = this.initialValue; - scope.setEval(this.exp, value); + scope.setEval(this.exp, this.formatter['parse'](value)); } value = value ? value : ''; if (this.lastValue != value) { @@ -248,21 +250,23 @@ TextController.prototype = { /////////////////////// // CheckboxController /////////////////////// -function CheckboxController(view, exp) { +function CheckboxController(view, exp, formatter) { this.view = view; this.exp = exp; this.lastValue = undefined; + this.formatter = formatter; this.initialValue = view.checked ? view.value : ""; }; CheckboxController.prototype = { - updateModel: function(scope) { + updateModel: function(scope) { + jstd.console.log("model"); var input = this.view; var value = input.checked ? input.value : ''; if (this.lastValue === value) { return false; } else { - scope.setEval(this.exp, value); + scope.setEval(this.exp, this.formatter['parse'](value)); this.lastValue = value; return true; } @@ -273,9 +277,10 @@ CheckboxController.prototype = { var value = scope.eval(this.exp); if (typeof value === "undefined") { value = this.initialValue; - scope.setEval(this.exp, value); + scope.setEval(this.exp, this.formatter['parse'](value)); } - input.checked = input.value == (''+value); + value = this.formatter['format'](value); + input.checked = input.value == value; } }; |
