Angularjs: form validation and input directive

后端 未结 2 656
情话喂你
情话喂你 2020-12-09 23:14

I created a directive in an AngularJS app which produces styled input in my application. It looks like this:

AC.directive(\'formInput\',function ($compile) {         


        
相关标签:
2条回答
  • 2020-12-09 23:58

    Try my dynamic-name directive here: AngularJS dynamic form field validation

    Replace name="{{opts.inputname}}" with dynamic-name="opts.inputname"

    I also simplified your code for demonstration:

    app.directive("dynamicName", function($compile) {
      return {
        restrict: "A",
        terminal: true,
        priority: 1000,
        link: function(scope, element, attrs) {
          var name = scope.$eval(attrs.dynamicName);
          if (name) {
            element.attr('name', name);
            element.removeAttr("dynamic-name");
            $compile(element)(scope);
          }
        }
      };
    });
    
    app.directive('formInput', function($compile) {
      return {
        replace: true,
        scope: {},
        templateUrl: 'formInput.html',
        restrict: 'E',
        link: function(scope, element, attrs) {
          scope.opts = attrs;
    
    
          $compile(element.contents())(scope);
        }
      }
    });
    

    Form Input template:

    <label class="acxm-textfield {{opts.cssclass}}">
      <span ng-bind="opts.labeltext"></span>
      <input type="{{opts.type}}" dynamic-name="opts.inputname" ng-model="opts.inputvalue"
      placeholder="{{opts.placeholder}}" 
      ng-maxlength="{{opts.maxLength}}" required/> //use dynamic-name directive to bind dynamic names.
    </label>
    

    DEMO (try clearing the text to see the validation, I used required validation for quick demonstration, you could change the code to email validation). The key is using the dynamic-name directive.

    0 讨论(0)
  • 2020-12-10 00:04

    Here is another take on form / name validation directives stacklink

    <form name="myFormName">
      <nested directives of many levels>
      ex: <input ng-repeat=(index, variable) in variables" type="text"
                 my-name="{{ variable.name + '/' + 'myFormName' }}"
                 ng-model="variable.name" required />
      ex: <select ng-model="variable.name" ng-options="label in label in {{ variable.options }}"
                 my-name="{{ variable.name + '/' + 'myFormName' }}"
          </select>
    </form
    

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    app.directive('rsName', function(){
    
      var rsNameError = "rsName directive error: "
    
      return {
        restrict:'A', // Declares an Attributes Directive.
        require: 'ngModel', // ngModelController.
    
        link: function( scope, elem, attrs, ngModel ){
          if( !ngModel ){ return } // no ngModel exists for this element
    
          // check rsName input for proper formatting ex. something/something
          checkInputFormat(attrs);
    
          var inputName = attrs.rsName.match('^\\w+').pop(); // match upto '/'
          assignInputNameToInputModel(inputName, ngModel);
    
          var formName = attrs.rsName.match('\\w+$').pop(); // match after '/'
          findForm(formName, ngModel, scope);
        } // end link
      } // end return
    
      function checkInputFormat(attrs){
        if( !/\w\/\w/.test(attrs.rsName )){
          throw rsNameError + "Formatting should be \"inputName/formName\" but is " + attrs.rsName
        }
      }
    
      function assignInputNameToInputModel(inputName, ngModel){
        ngModel.$name = inputName
      }
    
      function addInputNameToForm(formName, ngModel, scope){
        scope[formName][ngModel.$name] = ngModel; return
      }
    
      function findForm(formName, ngModel, scope){
        if( !scope ){ // ran out of scope before finding scope[formName]
          throw rsNameError + "<Form> element named " + formName + " could not be found."
        }
    
        if( formName in scope){ // found scope[formName]
          addInputNameToForm(formName, ngModel, scope)
          return
        }
        findForm(formName, ngModel, scope.$parent) // recursively search through $parent scopes
      }
    });
    
    0 讨论(0)
提交回复
热议问题