JSFiddle - React, Tailwind, and code Playground

by Ravindra Athreya

HTML

<div ng-app="app">
    <form name="theForm" ng-controller="FormCtrl" novalidate="novalidate" autocomplete="off">
        <input type="text" ng-model="form.tel" rpattern="/\d{3}/" ng-required="form.requireTel" />
        <input type="checkbox" ng-model="form.requireTel" />
        <button ng-disabled="theForm.$invalid" ng-click="action()">Action</button>
    </form>
</div>

JavaScript

/** This is the example model */
function Form() {
    this.tel = null;
    this.requireTel = true;
}


var app = angular.module("app",[]);

app.controller("FormCtrl", function($scope) {
    angular.extend($scope, {
        form: new Form(),
        action: action
    });
    
    function action() {
        console.log($scope.form);
    }
});

app.directive("rpattern", function() {
    return {
        restrict: "A",
        require: "ngModel",
        link: function(scope, el, attrs, ngModel) {
            var validator, patternValidator,
                pattern = attrs.rpattern,
                required = true;
            
            if( pattern ) {
                if (pattern.match(/^\/(.*)\/$/)) {
                    pattern = new RegExp(pattern.substr(1, pattern.length - 2));
                    patternValidator = function(value) {
                        return validate(pattern, value)
                    };
                }
                else {
                    patternValidator = function(value) {
                        var patternObj = scope.$eval(pattern);
                        if (!patternObj || !patternObj.test) {
                            throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj);
                        }
                        return validate(patternObj, value);
                    };
                }
            }
            
            ngModel.$formatters.push(patternValidator);
            ngModel.$parsers.push(patternValidator);
            
            attrs.$observe("required", function(newval) {
                required = newval;
                patternValidator(ngModel.$viewValue);
            });
            
            function validate(regexp, value) {
                if( value == null || value === "" || !required || regexp.test(value) ) {
                    ngModel.$setValidity('pattern', true);
                    return value;
                }
                else {
          ...