AngularJS:在表单外调用ng-submit事件

Cal*_*ald 32 html javascript form-submit angularjs angularjs-directive

我是AngularJS的鱼,我有这个场景.

<form>
    <input type="text">
</form>
<button type="submit">submit</button>
Run Code Online (Sandbox Code Playgroud)

在正常情况下,AngularJS提供ng-submit指令作为表单中的属性,但我需要在外面调用它.

那么,有人遇到过同样的问题吗?如果是的话,你做了什么?

Hod*_*des 52

使用HTML5的form属性,这是一个示例:

angular.module('app', [])

.controller('MyCtrl', ['$scope', function($scope) {
  $scope.submitted = false;
  
  $scope.confirm = function() {
    $scope.submitted = true;
  };
}]);
Run Code Online (Sandbox Code Playgroud)
form {
  padding:5px;
  border: 1px solid black
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body ng-controller="MyCtrl">
  
  <form id="myform" ng-submit="confirm()">
    <label for="myinput">My Input</label>
    <input type="text" id="myinput" name="myinput">
  </form>
  <br>
  
  <input type="submit" value="Submit" form="myform">
  
  <p ng-show="submitted">
    The form was submitted
  </p>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • Internet Explorer http://caniuse.com/#feat=form-attribute似乎不支持此解决方案 (7认同)
  • 最简单的修复.起初我没有注意到form = value需要匹配表单的id,而不是表单的名称(以防它帮助其他人).它也可以写成`<button type ="submit"form ="myform"> Save </ button>` (7认同)
  • 这可能是一个干净的解决方案,但这完全打破了Internet Explorer的支持@CorySchires 100%正确.我建议所有需要IE支持的人忽略这个解决方案. (2认同)

Joa*_*olo 17

请使用ng-controller包围您的代码,并使用ng-单击<form>范围之外的按钮.

我在jsfiddle上为你做一个样本...试试吧:

http://jsfiddle.net/xKkvj/2/

<div ng-app>
    <div ng-controller="Ctrl">
        <form ng-submit="submit()">Enter text and hit enter:
            <input type="text" ng-model="text" name="text" />
            <input type="submit" id="submit" value="Submit" /> <pre>list={{list}}</pre>
        </form>
        <button ng-click="submit()">Submit 2</button>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

与js:

function Ctrl($scope) {
    $scope.list = [];
    $scope.text = 'hello';
    $scope.submit = function () {
        if ($scope.text) {
            $scope.list.push($scope.text);
            $scope.text = '';
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我需要传递表单以进行验证,该怎么办?:`<form name ="myForm"ng-submit ="submit(myform)">` (4认同)

sbe*_*lin 9

这是迄今为止我找到的最干净的解决方案,所有信用都归@Offereins /sf/answers/1641983381/

<form ng-submit="vm.submit()">
    <input type="text" name="name" />
    <input type="submit" id="submit-form" class="hidden" />
</form>
<label for="submit-form">
    <button type="submit">submit</button>
</label>
Run Code Online (Sandbox Code Playgroud)

此方法不需要任何其他控制器JS或其他jQuery调整.


edq*_*rty 5

Angular 2

对于希望使用Angular 2实现相同功能的任何人,ngForm会公开您可以使用的事件发射器.

https://angular.io/api/forms/NgForm

<form role="form" (ngSubmit)="onSubmit()" #myForm="ngForm">
<div class="form-group">
    <label for="name">Name</label>
    <input autofocus type="text" ngControl="name" #name="ngForm" class="form-control" id="name" placeholder="Name">
    <div [hidden]="name.valid || name.pristine" class="alert alert-danger">
        Name is required
    </div>
</div>
</form>
<button type="submit" class="btn btn-primary" (click)="myForm.ngSubmit.emit()">Add</button>
Run Code Online (Sandbox Code Playgroud)

您还可以从组件ts/js文件中执行相同的发射

  • 这解决了我使用角度5在IE 11中提交表单的问题.看起来上面的链接已经死了,现在在这里:https://angular.io/api/forms/NgForm (2认同)