从父指令访问表单 - 动态表单名称和验证

时间:2015-11-21 22:20:11

标签: angularjs angularjs-directive angularjs-scope

引言

  • 我需要找到一种方法来验证在directive中动态创建的表单,这些表单将它们组合在一起。
  • 验证错误应出现在每个单独表单的表单提交上,我没有显示错误的问题

指令

包含多个表单,这些表单都是单独提交的

app.directive('multiFormWrapper', function() {

    return {
        templateUrl: 'templates/directives/multiform-wrapper.html',
        restrict: 'A',
        scope: {
            pageId: '@',
            attributeName: '@',
            multivaluedAttribute: '=',
            callbacks: '='
        }
    };
});

TEMPLATE

仅限重要部分,请查看nameng-submit

<div class="row" ng-repeat="group in multivaluedAttribute">
    <form 
        name="{{attributeName}}EditForm{{group.index}}" 
        novalidate 
        id="{{pageId}}-form{{attributeName}}Edit{{group.index}}"
        ng-submit="callbacks.updateMultivalued(attributeName, value)">

        <div class="row" ng-repeat="field in group.fields">
            <div input-field-directive input-field="field"></div>
        </div>

    </form>

问题

为了实现验证消息显示在表单上,​​我希望仅在form.$valid时发送数据:

ng-submit="{{attributeName}}EditForm{{group.index}}.$valid &&  
            callbacks.updateMultivalued(attributeName, value)">

但是表单的名称是在表达式中创建的。

问题

  1. 有没有办法以某种方式为表单名称添加别名? (我不这么认为)
  2. 我应该创建另一个包装单个表单的指令,获取包含FormController的句柄并覆盖submit吗?如果有办法在没有创建额外指令的情况下执行此操作会很棒,但linkcompile multiFormWrapper
  3. 中的所有表单实例

1 个答案:

答案 0 :(得分:0)

我的方法似乎错了,在code.realcrowd.com博文中,作者正在使用一种方法将ng-submit替换为自定义指令,如果表单为{submit,则取消invalid {1}}

app.directive('rcSubmit', ['$parse', function($parse) {
    return {
        restrict: 'A',
        require: 'form',
        link: function (scope, formElement, attributes, formController) {

            var fn = $parse(attributes.rcSubmit);

            formElement.bind('submit', function (event) {
                // if form is not valid cancel it.
                if (!formController.$valid) return false;

                scope.$apply(function() {
                    fn(scope, {$event:event});
                });
            });
        }
    };
}]);