diff options
Diffstat (limited to 'src/widgets2.js')
| -rw-r--r-- | src/widgets2.js | 71 | 
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  | 
