我在Angular中有一个表单,其中有两个按钮标签。一个按钮在ng-click中提交表单。另一个按钮是纯粹的导航使用ng-click。然而,当点击第二个按钮时,AngularJS会导致页面刷新,并触发404错误。我在函数中放置了一个断点,它触发了我的函数。如果我做了以下任何一项,它就会停止:

如果我删除ng-click,该按钮不会导致页面刷新。 如果我注释掉函数中的代码,它不会引起页面刷新。 如果我用href=""将按钮标记更改为锚标记(<a>),那么它不会引起刷新。

后者似乎是最简单的解决方法,但为什么AngularJS还要在我的函数后面运行导致页面重新加载的代码呢?看起来像个bug。

表格如下:

<form class="form-horizontal" name="myProfile" ng-switch-when="profile">
  <fieldset>
    <div class="control-group">
      <label class="control-label" for="passwordButton">Password</label>
      <div class="controls">
        <button id="passwordButton" class="secondaryButton" ng-click="showChangePassword()">Change</button>
      </div>
    </div>

    <div class="buttonBar">
      <button id="saveProfileButton" class="primaryButton" ng-click="saveUser()">Save</button>
    </div>
  </fieldset>
</form>

下面是控制器方法:

$scope.showChangePassword = function() {
  $scope.selectedLink = "changePassword";
};

当前回答

我使用指令来防止默认行为:

module.directive('preventDefault', function() {
    return function(scope, element, attrs) {
        angular.element(element).bind('click', function(event) {
            event.preventDefault();
            event.stopPropagation();
        });
    }
});

然后,在html中:

<button class="secondaryButton" prevent-default>Secondary action</button>

此指令也可以与<a>和所有其他标签一起使用

其他回答

我想知道为什么没有人提出可能最简单的解决方案:

不要使用<表单>

在我看来,一个<whatever ng-form>做得更好,没有HTML表单,浏览器本身就没有什么要提交的。这正是使用angular时的正确行为。

你应该在<form>标签中声明属性ng-submit={expression}。

来自ngSubmit文档 http://docs.angularjs.org/api/ng.directive:ngSubmit

允许将角表达式绑定到onsubmit事件。 此外,它还防止了默认操作(对于表单来说,这意味着将请求发送到服务器并重新加载当前页面)。

第一个按钮提交表单,第二个按钮不提交

<body>
<form  ng-app="myApp" ng-controller="myCtrl" ng-submit="Sub()">
<div>
S:<input type="text" ng-model="v"><br>
<br>
<button>Submit</button>
//Dont Submit
<button type='button' ng-click="Dont()">Dont Submit</button>
</div>
</form>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.Sub=function()
{
alert('Inside Submit');
}

$scope.Dont=function()
{
$scope.v=0;
}
});
</script>

</body>

向表单添加动作。

<形式action = " # " >

只需在app.module.ts文件的imports数组中添加FormsModule, 添加import {FormsModule} from '@angular/forms';在这个文件的顶部…这是可行的。