角度表单控制器验证



我有这个html形式:

<div class="modal-body">
        <form name="addAdminForm">
            <div class="form-group addPopupLabel">
                <div class="container-fluid-full" id="email3">
                    <input placeholder="Email" type="text" ng-model="model.email" required />
                </div>
                <div class="container-fluid-full">
                    <input placeholder="Password (at last 6 characters)" type="password" ng-model="model.password1" id="pw1" name="pw1" required />
                </div>
                <div class="container-fluid-full">
                    <input placeholder="Confirm password" type="password" ng-model="model.password2" id="pw2" name="pw2" required password-compare="pw1" />
                </div>
                <div class="container-fluid-full">
                    <label>Admin</label>
                    <input type="radio" class="form-control" name="role" ng-model="model.role" ng-value="userRoles.admin">
                </div>
                <div class="container-fluid-full">
                    <label>CS</label>
                    <input type="radio" class="form-control" name="role" ng-model="model.role" ng-value="userRoles.cs">
                </div>
                <div>
                    <span class="errormessage" style="color:red">{{errormessage}}</span>
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer">
        <button class="btn btn-primary" ng-disabled="addAdminForm.$invalid" ng-click="createForm.$invalid || ok()">Submit</button>
        <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
    </div>

问题:按钮保持禁用模式,而其中一个字段处于焦点。我怎样才能通过表单控制器解决它?

addAdminForm的作用

域在窗体中。因此,一种选择是在窗体中移动按钮,或移动窗体元素以使其包装按钮。我更喜欢这个,因为它非常简单,而且大多数时候都是可行的。

如果由于某种原因无法实现,则可以发出指令,将窗体的$invalid标志导出到外部作用域的变量。一个简单的实现是:

app.directive('bindValidity', ['$parse', function($parse) {
    return {
        restrict: 'A',
        scope: false,
        controller: ['$scope', '$attrs', function($scope, $attrs) {
            var assign = $parse($attrs.bindValidity).assign;
            if (!angular.isFunction(assign)) {
                throw new Error('the expression of bindValidity is not settable: ' + $attrs.bindValidity);
            }
            this.setFormController = function(formCtrl) {
                if (!formCtrl) {
                    throw new Error('bindValidity requires one of <form> or ng-form');
                }
                $scope.$watch(
                    function () {
                        return formCtrl.$invalid;
                    },
                    function (newval) {
                        assign($scope, newval);
                    }
                );
            };
        }],
        require: ['?form', '?ngForm', 'bindValidity'],
        link: function (scope, elem, attrs, ctrls) {
            var formCtrl, bindValidity;
            formCtrl = ctrls[0] || ctrls[1];
            bindValidity = ctrls[2];
            bindValidity.setFormController(formCtrl);
        }
    };
}]);

将其用作:

<div class="modal-body">
    <form name="addAdminForm" bind-validity="some.variable">
        ...
    </form>
    <div class="modal-footer">
        <button ... ng-disabled="some.variable" ng-click="some.variable || ok()">Submit</button>

最新更新