我正在使用ng-click,当我将其应用于SPAN标记时会触发两次。
HTML
<div ng-app="regApp" ng-controller="RegistrationCtrl" data-ng-init="GetEventDetail()" ng-show="data.EventName">
<h2>Registration for {{data.EventName}}</h2>
<span class="btn" id="btnSave" ng-click="PostRegistration()">Save </span>
</div>
CONTROLLER
var app = angular.module('regApp', ['ui']);
app.controller('RegistrationCtrl', function ($scope, $http) {
$scope.PostRegistration = function () {
alert('click '); <--- fires twice
/// some code here --
};
它应该只发射一次。我怎么能找到为什么会发生这种情况以及如何解决它?
答案 0 :(得分:28)
答案 1 :(得分:16)
我遇到了类似的问题,但无法找到我在文件中两次包含Angular的位置。
我使用ajax调用来加载特定的表单布局,因此我需要使用$compile
来激活插入的DOM上的Angular。但是,我在我的指令$compile
上使用了$element
,它附加了一个控制器。原来这个“包括”控制器两次,导致两个触发器ng-click
或ng-submit
。
我通过直接在插入的DOM上使用$compile
而不是我的指令$element
来修复此问题。
答案 2 :(得分:9)
这可能是模糊不清的,但我已经ng-click
两次因为我运行了BrowserSync,这会将我的输入反映到我在另一个窗口中打开的标签中,从而使我的所有点击倍增。要解决这个问题,我禁用了“ghostMode”:https://www.browsersync.io/docs/options/
答案 3 :(得分:9)
使用
的同样问题<a ng-click="fn()"></a>
fn被叫了两次
使用固定的按钮:
<button ng-click="fn()"></button>
答案 4 :(得分:7)
我通过删除我的ngsubmit处理程序解决了这个问题,因为我不需要它。我正在监视变更事件并使用SignalR近乎实时地更新屏幕。
我也处于一种形式和AngularJS docs for ngSubmit状态:
警告:小心不要同时使用
ngClick
和ngSubmit
处理程序导致“双重提交”。有关何时可以触发ngSubmit
的详细讨论,请参阅表单directive documentation。
答案 5 :(得分:6)
如果有人遇到同样的问题: 这是我的问题:
<a type="submit" ng-click="login()">submit login<a>
type="submit"
和ng-click="login()"
都触发了我的控制器中的login()方法。
所以只需使用type = submit或ng-click指令
即可答案 6 :(得分:5)
如果其他答案没有帮助,请确保在Batarang中禁用AngularJS分析(如果您已经安装了它)。
这让我点击两次为我开火。
答案 7 :(得分:4)
元素彼此包裹,这可能导致触发事件两次或更多次。
所以我在这个解决方案中使用了一个简单的CSS技巧:
Array
并将其应用于与click事件对应的元素。
答案 8 :(得分:3)
当我意外地在循环中多次调用动态添加元素的$ compile时,我得到了它,而不仅仅是一次。只编译一次就删除了这个效果。
答案 9 :(得分:2)
面临同样的问题。 发现他们正在使用https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js版本,我将其切换到最新的1.4.5版本,它只是起作用。
https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js
var app = angular.module('regApp', []);
app.controller('RegistrationCtrl', ['$scope','$http',function($scope,$http ) {
$scope.PostRegistration = function() {
alert('click '); // <--- fires twice
/// some code here --
};
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="regApp" ng-controller="RegistrationCtrl">
<h2 >Registration for {{data.EventName}}</h2>
<span ng-click="PostRegistration()" class="btn" id="btnSave">Save </span>
</div>
答案 10 :(得分:2)
我已将&lt; button ng-click ='clickHandler()'&gt; 更改为&lt; a ng-click ='clickHandler()'&gt; ,现在事件只发射一次
答案 11 :(得分:2)
您可以使用ng-submit在表单容器中进行ng-click。在这种情况下,请为所有使用ng-click添加type =“button”。
答案 12 :(得分:1)
在我的SPA(单页应用程序)中动态注入部分视图时,我遇到了同样的问题。我解决它的方法是将div的内容存储在本地变量中,如下所示:
var html = $("#leftContainer").html();
然后清空div并重置其内容,如下所示:
$("#leftContainer").empty();
$("#leftContainer").append(html);
现在您可以添加从AJAX调用中收到的任何其他html或动态构建的文件,最后记得重新编译HTML以使其绑定到angular:
var entities = $("#entitiesContainer");
var entity = "<div><a href='#' ng-click='Left(" + entityId + ")'> " + entityName + "</a><div>"
entities.append(entity);
var leftContainer = angular.element(document.getElementById("entitiesContainer"));
$compile(leftContainer)($scope);
答案 13 :(得分:1)
我也有这样的问题。
<button style="width: 100%;" class="btn btn-danger" ng-click="'{{vm.delete()}}'">
这不是你如何调用ng-click,但没有抛出任何错误,函数调用仍然有效。
<button style="width: 100%;" class="btn btn-danger" ng-click="vm.delete()">
是正确的,然后只会被调用一次。
答案 14 :(得分:1)
这种情况可能是因为缺少Angular中的ngTouch。
如果加载了ngTouch,则可能会出现Angular 1.5.0之前的ngTouch和ngClick中的bug。这是因为设备工具栏或移动设备上的Chrome for Desktop中的pointerup
和mouseUp
触发了ngClick。
答案 15 :(得分:1)
我有点像个假人,有这个:
<li data-shape="amethyst" ng-click="toggleGem('amethyst')">
<label></label>
<i class="amethyst"></i>Amethyst
<input type="checkbox" name="gem_type" id="gem-amethyst" value="amethyst" />
</li>
点击事件触发了两次。我将ng-click移动到label元素,它按预期工作。
<li data-shape="amethyst">
<label ng-click="toggleGem('amethyst')"></label>
<i class="amethyst"></i>Amethyst
<input type="checkbox" name="gem_type" id="gem-amethyst" value="amethyst" />
</li>
答案 16 :(得分:0)
我不知道发生这种情况的原因是什么,但我必须使用event.stopPropagation();
内部的JavaScript函数。
HTML
<button class="button" ng-click="save($event)">Save</button>
JAVASCRIPT
function save(event) {
event.stopPropagation();
}
答案 17 :(得分:0)
HTML:
<div>
<ui>
<li>
<button class="Button" ng-disabled="self.desableSubmitButton" ng-
click="self.SubmitClick($event)">Submit</button>
</li>
</ui>
</div>
Angular 1.0控制器:
_self.SubmitClick = function(event){
_self.desableSubmitButton = true; //disable submit button
event.preventDefault();
event.stopPropagation();
setTimeout(funtion() {
_self.desableSubmitButton = false; //enable submit button after timeout
if(_self.$scope.$$phase != '$apply' || _self.$scope.$$phase != '$digest'){
_self.$scope.$digest();
}
}, 1000);//other Code logic
}
答案 18 :(得分:0)
我的情况:我在自定义的自定义角度复选框组件上使用了 ng-click 事件。所以只需为自定义组件提供一个方法绑定就可以了。
之前:
<mono-checkbox-ng ng-click="vm.onSelectAllClicked()">
之后:
<mono-checkbox-ng on-changed="vm.onSelectAllClicked()">