棱角分明的FormController验证 [英] angular FormController validation

查看:111
本文介绍了棱角分明的FormController验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的HTML表单:

I have this html form:

<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>

问题:按钮停留在关闭模式,而其中一个字段是焦点。
我怎样才能通过的FormController解决呢?

The problem: button stay on disable mode while one of the fields is on focus. How can i solve it by FormController?

推荐答案

addAdminForm 在表单范围内。因此,一种选择是在表单中移动的按钮,或者使其包装的按钮移动表单元素。我想preFER这一点,因为它是死的简单,最可行的时间

The addAdminForm is scoped within the form. So one option is to move the buttons within the form, or move the form element so that it wraps the buttons. I would prefer this since it is dead simple and most times doable.

如果这是不可能因为某些原因,你可以做一个指令形式的 $无效标志输出到外部范围的变量。一个简单的实现将是:

If it is not possible for some reason, you can make a directive to export the $invalid flag of a form to a variable of the outer scope. A simple implementation would be:

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>

这篇关于棱角分明的FormController验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆