如何在AngularJS中以编程方式触发表单提交?

时间:2014-12-29 13:53:35

标签: javascript angularjs html5 forms

根据Angular的文档,ngSubmit是提交表单的首选方式。所有待处理的操作立即完成,并且还设置了$submitted标志。而听ngClick事件不会产生同样的效果。

现在我需要提交一个包含热门密钥的表单,其中包含ngSubmit方法的所有好处。因此,我需要一些方法来触发标准提交工作流程。

我在DOM表单上尝试submit()并且它有效,但是附加到范围的angular的表单对象不包含对DOM表单的引用,因此我需要通过jqLit​​e访问它:

var frm = angular.element('#frmId');
frm.submit();

我不喜欢这种在控制器代码中访问DOM的解决方案,所以我创建了一个指令:

function wuSubmit() {
    return {
        require: 'form',
        restrict: 'A',
        link: function(scope, element, attributes) {
            var scope = element.scope();
            if (attributes.name && scope[attributes.name]) {
                scope[attributes.name].$submit = function() {
                    element[0].submit();
                };
            }
        }
    };
}

使用$submit方法扩展表单对象。

两种变体都不能用于未知原因。 form.submit()尝试发送数据,不会阻止默认操作

更新1
事实证明,Angular会侦听具有type="input"的元素的点击事件 最终我决定触发该元素的click事件:

wuSubmit.$inject = ['$timeout'];
function wuSubmit($timeout) {
    return {
        require: 'form',
        restrict: 'A',
        link: function (scope, element, attributes) {
            var submitElement = element.find('[type="submit"]').first();

            if (attributes.name && scope[attributes.name]) {

                scope[attributes.name].$submit = submit;
            }

            function submit() {
                $timeout(function() {
                    submitElement.trigger('click');
                });
            }
        }
    };
}

此功能是否有开箱即用的解决方案?

3 个答案:

答案 0 :(得分:4)

只需在表单元素上使用事件.triggerHandler(' submit')。

myApp.directive("extSubmit", ['$timeout',function($timeout){
    return {
        link: function($scope, $el, $attr) {
            $scope.$on('makeSubmit', function(event, data){
              if(data.formName === $attr.name) {
                $timeout(function() {
                  $el.triggerHandler('submit'); //<<< This is Important

                  //equivalent with native event
                  //$el[0].dispatchEvent(new Event('submit')) 
                }, 0, false);   
              }
            })
        }
    };
}]);

查看http://jsfiddle.net/84bodm5p/

答案 1 :(得分:1)

app.directive("form", function(){
     return {
        require: 'form',
        restrict: 'E',
        link: function(scope, elem, attrs, form) {
            form.doSubmit = function() {
                form.$setSubmitted();
                return scope.$eval(attrs.ngSubmit);
            };
        }
    };
});

HTML:

<form name="myForm" ng-submit="$ctrl.submit()" novalidate>

然后在控制器中调用

$scope.myForm.doSubmit();

答案 2 :(得分:0)

您可以修改指令代码,如:

function wuSubmit() {
    return {
        require: 'form',
        restrict: 'A',
        link: function(scope, element, attributes) {
            var scope = element.scope();
            if (attributes.name && scope[attributes.name]) {
                scope[attributes.name].$submit = function() {
                    // Parse the handler of submit & execute that.
                    var fn = $parse(attr.ngSubmit);
                    $scope.$apply(function() {
                        fn($scope, {$event: e});
                    });
                };
            }
        }
    };
}

此处您无需在任何地方添加wu-submitng-submit可以使用。

希望这有帮助!