2016-09-09 9 views
3

カレンダービューのない入力エレメントの生年月日タイプを作成しています。すなわち、ユーザは入力によって日付を入力する。AngularJS生年月日のカスタム入力に必要なエラーが表示されない

コード

angular.module('myApp', []) 
 
.directive('birthDatePicker', [ function() { 
 
     return { 
 
      restrict: 'A', 
 
      require: 'ngModel', 
 
      scope: { 
 
       model: '=ngModel', 
 
      }, 
 
      link: function (scope, element, attrs, ngModel) { 
 

 
       //SET CURSOR POSITION 
 
       var setCursorPosition = function(pos) { 
 
        if (element[0].setSelectionRange) { 
 
         element[0].focus(); 
 
         element[0].setSelectionRange(pos, pos); 
 
        } else if (element[0].createTextRange) { 
 
         var range = element[0].createTextRange(); 
 
         range.collapse(true); 
 
         range.moveEnd('character', pos); 
 
         range.moveStart('character', pos); 
 
         range.select(); 
 
        } 
 
       }; 
 

 
       // RESET VALIDATION ERRORS 
 
       var resetErrors = function() { 
 
        ngModel.$setValidity('pattern',true); 
 
       }; 
 

 
       if (!ngModel) return; 
 
       var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate; 
 
       ngModel.$parsers.unshift(function (inputValue) { 
 
        var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); }); 
 
        d1 = digits[0] ? digits[0] : 'd'; 
 
        d2 = digits[1] ? digits[1] : 'd'; 
 
        m1 = digits[2] ? digits[2] : 'm'; 
 
        m2 = digits[3] ? digits[3] : 'm'; 
 
        y1 = digits[4] ? digits[4] : 'y'; 
 
        y2 = digits[5] ? digits[5] : 'y'; 
 
        y3 = digits[6] ? digits[6] : 'y'; 
 
        y4 = digits[7] ? digits[7] : 'y'; 
 
        dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4; 
 

 
        resetErrors(); 
 

 
        if(dateString == 'dd/mm/yyyy') { 
 
         ngModel.$viewValue = ''; 
 
         ngModel.$render(); 
 
         return ngModel.$viewValue; 
 
        } 
 

 
        ngModel.$viewValue = dateString; 
 
        ngModel.$render(); 
 
        cursorPos = digits.length + 2; 
 
        if(digits.length < 3) { 
 
         cursorPos = digits.length; 
 
        } else if (digits.length < 5) { 
 
         cursorPos = digits.length + 1; 
 
        } 
 

 
        setCursorPosition(cursorPos); 
 

 
        parsedDate = new Date(ngModel.$viewValue); 
 

 
        // validation for correct date 
 
        if(isNaN(parsedDate.getTime())){ 
 
         ngModel.$setValidity('pattern',false); 
 
         return ngModel.$viewValue; 
 
        } else { 
 
         ngModel.$setValidity('pattern',true); 
 
        } 
 

 
        return ngModel.$viewValue; 
 
       }); 
 
      } 
 
     }; 
 
    }]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script> 
 
<body ng-app="myApp"> 
 
    <form name="myForm" novalidate> 
 
    <input ng-model="date" name="question" 
 
      placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required> 
 
    <p ng-show="myForm.question.$error.required">Date is Required</p> 
 
    <p ng-show="myForm.question.$error['pattern']">Date is incorrect</p> 
 
    <input type="submit"> 
 
    </form> 
 
</body>

問題は、エラーメッセージを表示してあります。メッセージDate is requiredは、初めて送信ボタンが押された場合にのみ表示されます。ユーザーがbackspaceキーを押して入力値をクリアしたときは機能しません。

更新:AngularJSの下位バージョンで 、それは私が何を望むかのようにうまく働いているが、AngularJS 1.5.8で、私は不運を持っています。 :(

...コーディング!

+0

私はうまく動作します!私はここで何の質問や問題は表示されません...私はかなりurの質問を得ることができなかったかもしれないあなたは精巧なことができますか? –

+0

@ Angular_10はい、機能は完璧です。しかし、小さな問題があります。これらのステップに従ってください。1.日付を記入し始めます。2.バックスペースを押してフィールドをクリアします。3.「Date is required」というメッセージが表示されますが、実際には表示されません。送信ボタンを押してください。 –

+0

さて、私はちょうどそれを観察!その場合は、ng-keydownでバックスペースイベントを捕捉し、それぞれのメッセージを設定する関数をあなたのディレクティブに書き込んでください。それは私のために働いています! –

答えて

0

https://docs.angularjs.org/api/ngMessages/directive/ngMessagesのドキュメントと、そのページ上の例によれば、これはあなたがNG-メッセージを使用する方法である

幸せ。私は、この問題に取り組む助け

してください

angular.module('myApp', []) 
 
.directive('birthDatePicker', [ function() { 
 
     return { 
 
      restrict: 'A', 
 
      require: 'ngModel', 
 
      scope: { 
 
       model: '=ngModel', 
 
      }, 
 
      link: function (scope, element, attrs, ngModel) { 
 

 
       //SET CURSOR POSITION 
 
       var setCursorPosition = function(pos) { 
 
        if (element[0].setSelectionRange) { 
 
         element[0].focus(); 
 
         element[0].setSelectionRange(pos, pos); 
 
        } else if (element[0].createTextRange) { 
 
         var range = element[0].createTextRange(); 
 
         range.collapse(true); 
 
         range.moveEnd('character', pos); 
 
         range.moveStart('character', pos); 
 
         range.select(); 
 
        } 
 
       }; 
 

 
       // RESET VALIDATION ERRORS 
 
       var resetErrors = function() { 
 
        ngModel.$setValidity('pattern',true); 
 
       }; 
 

 
       if (!ngModel) return; 
 
       var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate; 
 
       ngModel.$parsers.unshift(function (inputValue) { 
 
        var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); }); 
 
        d1 = digits[0] ? digits[0] : 'd'; 
 
        d2 = digits[1] ? digits[1] : 'd'; 
 
        m1 = digits[2] ? digits[2] : 'm'; 
 
        m2 = digits[3] ? digits[3] : 'm'; 
 
        y1 = digits[4] ? digits[4] : 'y'; 
 
        y2 = digits[5] ? digits[5] : 'y'; 
 
        y3 = digits[6] ? digits[6] : 'y'; 
 
        y4 = digits[7] ? digits[7] : 'y'; 
 
        dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4; 
 

 
        resetErrors(); 
 

 
        if(dateString == 'dd/mm/yyyy') { 
 
         ngModel.$viewValue = ''; 
 
         ngModel.$render(); 
 
         return ngModel.$viewValue; 
 
        } 
 

 
        ngModel.$viewValue = dateString; 
 
        ngModel.$render(); 
 
        cursorPos = digits.length + 2; 
 
        if(digits.length < 3) { 
 
         cursorPos = digits.length; 
 
        } else if (digits.length < 5) { 
 
         cursorPos = digits.length + 1; 
 
        } 
 

 
        setCursorPosition(cursorPos); 
 

 
        parsedDate = new Date(ngModel.$viewValue); 
 

 
        // validation for correct date 
 
        if(isNaN(parsedDate.getTime())){ 
 
         ngModel.$setValidity('pattern',false); 
 
         return ngModel.$viewValue; 
 
        } else { 
 
         ngModel.$setValidity('pattern',true); 
 
        } 
 

 
        return ngModel.$viewValue; 
 
       }); 
 
      } 
 
     }; 
 
    }]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script> 
 
<body ng-app="myApp"> 
 
    <form name="myForm" novalidate> 
 
    <input ng-model="date" name="question" 
 
      placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required> 
 
<div ng-messages="myForm.question.$error" role="alert"> 
 
     <div ng-message="required">Date is Required</div> 
 
     <div ng-message="pattern">Date is incorrect</div> 
 
</div> 
 
    <input type="submit"> 
 
    </form> 
 
</body>

+0

コードスニペットを実行すると、エラーメッセージが常に表示されます。 –

0

あなたはラッピングNG-モデルの悪いアプローチをしようとしています。 Ben Nadel approachを試してください。問題が発生するはずです。

関連する問題