aboutsummaryrefslogtreecommitdiffstats
path: root/src/widgets2.js
diff options
context:
space:
mode:
authorMisko Hevery2010-03-24 16:13:42 -0700
committerMisko Hevery2010-03-24 16:13:42 -0700
commit0c42eb9909d554807549cd3394e0ea0c715cc2d1 (patch)
tree331c637a5c86b87970166a0936874fec9c6920a6 /src/widgets2.js
parent3d3694240034b6841c9fdf2e38a2a7955cb592c7 (diff)
downloadangular.js-0c42eb9909d554807549cd3394e0ea0c715cc2d1.tar.bz2
input[type=text] now works with binding, validation, formatter, required
Diffstat (limited to 'src/widgets2.js')
-rw-r--r--src/widgets2.js71
1 files changed, 69 insertions, 2 deletions
diff --git a/src/widgets2.js b/src/widgets2.js
index b0f467d4..cee0e49e 100644
--- a/src/widgets2.js
+++ b/src/widgets2.js
@@ -1,3 +1,72 @@
+function scopeAccessor(scope, element) {
+ var expr = element.attr('name'),
+ farmatterName = element.attr('ng-format') || NOOP,
+ formatter = angularFormatter(farmatterName);
+ if (!expr) throw "Required field 'name' not found.";
+ if (!formatter) throw "Formatter named '" + farmatterName + "' not found.";
+ return {
+ get: function() {
+ return formatter['format'](scope.$eval(expr));
+ },
+ set: function(value) {
+ scope.$eval(expr + '=' + toJson(formatter['parse'](value)));
+ }
+ };
+}
+
+function domAccessor(element) {
+ var validatorName = element.attr('ng-validate') || NOOP,
+ validator = angularValidator(validatorName),
+ required = element.attr('ng-required'),
+ lastError;
+ required = required || required == '';
+ if (!validator) throw "Validator named '" + validatorName + "' not found.";
+ function validate(value) {
+ var error = required && !trim(value) ? "Required" : validator(value);
+ if (error !== lastError) {
+ if (error) {
+ element.addClass(NG_VALIDATION_ERROR);
+ element.attr(NG_ERROR, error);
+ } else {
+ element.removeClass(NG_VALIDATION_ERROR);
+ element.removeAttr(NG_ERROR);
+ }
+ lastError = error;
+ }
+ return value;
+ }
+ return {
+ get: function(){
+ return validate(element.attr(VALUE));
+ },
+ set: function(value){
+ element.attr(VALUE, validate(value));
+ }
+ };
+}
+
+var NG_ERROR = 'ng-error',
+ NG_VALIDATION_ERROR = 'ng-validation-error',
+ INPUT_META = {
+ 'text': ["", 'keyup change']
+};
+
+angularWidget('INPUT', function input(element){
+ var meta = INPUT_META[lowercase(element.attr('type'))];
+ return meta ? function(element) {
+ var scope = scopeAccessor(this, element),
+ dom = domAccessor(element);
+ scope.set(dom.get() || meta[0]);
+ element.bind(meta[1], function(){
+ scope.set(dom.get());
+ });
+ this.$watch(scope.get, dom.set);
+ } : 0;
+});
+
+
+
+
/////////////////////////////////////////
/////////////////////////////////////////
/////////////////////////////////////////
@@ -6,8 +75,6 @@
-
-
//widget related
//ng-validate, ng-required, ng-formatter
//ng-error