具有隔离范围的AngularJS表单验证

Dan*_*kay 6 javascript forms validation angularjs

我想使用AngularJS提供的内置表单验证.但是,在表单中我使用自定义指令,每个指令都有一个隔离范围.因此,表单元素无法访问绑定值.

知道如何解决这个问题吗?

或者,是否可以在不使用表单的情况下使用AngularJS验证?

ng-minlength和ng-required指令不会触发表单验证.

<div ng-app="myApp" ng-controller="myCtrl">
    <form name="myForm" novalidate>
        <do-something ng-model="variable"></do-something>
        <h4 data-ng-if="myForm.myElement.$error.required">Please enter something</h4>
        <h4 data-ng-if="myForm.myElement.$error.greaterThanOne">Please enter a value greater than 1</h4>
        <h4 data-ng-if="myForm.myElement.$error.minLength">Please enter something longer than 1 digit</h4>
    {{myForm.myElement.$error}}     
    </form>
</div>

var app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope) {
});
app.directive('doSomething', function () {
    return {
        restrict: 'E',
        require: '?ngModel',
        scope: {
            model: '=ngModel'
        },
        template: 
            '<div>' +
            '  <input name="myElement" ng-model="model" ng-required ng-minlength="1" />' +
            '</div>'
    }
});
Run Code Online (Sandbox Code Playgroud)

Full Plunk可以在这里找到:这是一个演示问题的plunkr:http://plnkr.co/edit/iWyvX2?p = preview

小智 2

根据我的理解,是的,您必须使用表单进行验证。

我验证的方式是设置如下指令

module.directive('ngDoSomething', function() {
    restrict: 'A'
    require: '?ngModel',
    scope: {
        model: '=ngModel'
    }
    link: function($scope, element, attrs, ngModel) {
    $scope.$watch('model', function(val) {
        ngModel.$setValidity('required', !!val);
        ngModel.$setValidity('greaterThanOne', val > 1);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后使用html

<form name="somethingForm">
  <input name="somethingElement" data-ng-do-something data-ng-model="variable" />
  <h4 data-ng-if="somethingForm.somethingElement.$error.required">Please enter something</h4>
  <h4 data-ng-if="somethingForm.somethingElement.$error.greaterThanOne">Please enter a value greater than 1</h4>
</form>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助