根据Angular的文档,ngSubmit是提交表单的首选方式。所有待处理的操作立即完成,并且还设置了$submitted
标志。而听ngClick
事件不会产生同样的效果。
现在我需要提交一个包含热门密钥的表单,其中包含ngSubmit
方法的所有好处。因此,我需要一些方法来触发标准提交工作流程。
我在DOM表单上尝试submit()
并且它有效,但是附加到范围的angular的表单对象不包含对DOM表单的引用,因此我需要通过jqLite访问它:
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');
});
}
}
};
}
此功能是否有开箱即用的解决方案?
答案 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);
}
})
}
};
}]);
答案 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-submit
。 ng-submit
可以使用。
希望这有帮助!