2013-06-18 54 views
24

Tôi có một chỉ thị xác nhận tùy chỉnh đang được gọi đúng khi một trường được thay đổi. Tuy nhiên, liệu trường này có hợp lệ hay không cũng dựa trên giá trị của trường khác. Trường thứ hai này là một danh sách lựa chọn nếu đó là tầm quan trọng.Xác thực kích hoạt của một trường khi một trường khác được thay đổi

Tôi đã tự hỏi nếu có một số cách tôi có thể kích hoạt xác nhận theo cách thủ công khi biểu mẫu thứ hai được thay đổi. Có lẽ bằng cách sử dụng sự kiện ng-change. Cách thích hợp để xử lý một cái gì đó như thế này là gì?

Dưới đây là chỉ thị của tôi:

angular.module('myApp', []). 
    directive('validage', function() { 
     return { 
      require: 'ngModel', 
      link: function (scope, elem, attr, ngModel) { 

       function validate(value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       } 

       //For DOM -> model validation 
       ngModel.$parsers.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 

       //For model -> DOM validation 
       ngModel.$formatters.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 
      } 
     }; 
    }); 

Nếu bạn là người mới đến AngularJS, Tôi chắc chắn sẽ khuyên bạn nên đọc những bài viết 2: part 1 & part 2. Chúng là một tổng quan về các dạng AngularJS.

+0

Vui lòng xem [câu trả lời này] (http://stackoverflow.com/a/16886177/2057033) trên StackOverflow. – Blackhole

+0

với góc 1,3 điều này hoạt động trong chỉ thị: ngModel. $ Validate(); –

+2

Trong anglular 1.2, bạn có thể tự kích hoạt tất cả các hàm trong $ parsers với ngModel. $ SetViewValue(). Vì vậy, chỉ cần đặt nó vào chính nó: ngModel. $ SetViewValue (ngModel. $ ViewValue) – likesalmon

Trả lời

0

Tôi đã kết thúc việc thêm chỉ thị vào trường thứ hai và sau đó thay đổi chỉ thị để thêm thông báo lỗi vào trường có lỗi. Có thể có một cách tốt hơn, nhưng đó là những gì tôi đã làm.

3

Tôi gặp vấn đề tương tự: hai trường biểu mẫu "interval" (cho $ scope.monitor.interval) và "timeout" (với $ scope.monitor.timeout) với điều kiện timeout không được vượt quá một nửa khoảng thời gian.

Trước tiên, tôi đã thêm trình xác thực tùy chỉnh vào thời gian chờ để kiểm tra điều kiện này. Bây giờ tôi cần kích hoạt trình xác nhận thời gian chờ cũng khi khoảng thời gian thay đổi. Tôi đạt được điều này bằng cách xem tài sản monitor.interval của mô hình:

function EditMonitorCtrl($scope, $log, dialog, monitor) { 
    $scope.monitor = monitor; 

    ... 

    // trigger validation of timeout field when interval changes 
    $scope.$watch("monitor.interval", function() { 
     if ($scope.editMonitorDlg.timeout.$viewValue) {   
      $scope.editMonitorDlg.timeout.$setViewValue($scope.editMonitorDlg.timeout.$viewValue); 
     } 
    }); 
} 

Nếu không có "nếu" giá trị timeout bị loại bỏ trong quá intialisation của hộp thoại.

44

Sau khi tìm kiếm rất nhiều cho điều này tôi đã tìm thấy rằng chúng tôi có thể kích hoạt xác nhận đơn giản bằng cách gọi $validate() trên trường mong muốn.
Vì vậy, ví dụ nếu mẫu của bạn được đặt tên My_Form (tức là trong đánh dấu toàn bộ thẻ form có một thuộc tính name="my_form") và tên của các trường bạn muốn xác nhận được ngày (trong đánh dấu các lĩnh vực đầu vào có name="date" thuộc tính), khi bạn đề xuất bạn có thể sử dụng sự kiện ng-change của trường thứ hai và gọi $scope.my_form.date.$validate(); bất cứ khi nào hàm ng-thay đổi được gọi.

+7

Cảm ơn bạn! Điều này cũng làm việc trong một chỉ thị bằng cách gọi ngModel. $ Validate(); .. ví dụ nếu bạn có thuộc tính bạn quan sát, bạn có thể xác thực lại mô hình :) –

+0

Phiên bản góc nào có sẵn? Tôi đang sử dụng 1.2.18 và tôi không thấy hàm $ validate(). –

+1

Tôi đang sử dụng phiên bản 1.3.2. '$ validate()' có sẵn phiên bản bắt đầu 1.3.0. Nhân tiện, bạn có thể xem thêm một số thông tin về mối quan hệ giữa ngmodel và tên của trường tại đây: https://code.angularjs.org/1.3.0/tài liệu/hướng dẫn/biểu mẫu, trong _Binding để hình thành và kiểm soát state_. – gneri

0

Tôi không thể nhận được ng-blur="myForm.myField.$validate()" làm việc trong AngularJS 1.5, có thể do mô hình cho myField bị trống.

Tuy nhiên, ng-blur="myForm.myField.$setTouched()" đã hoạt động.

Các vấn đề liên quan