Ответ 1
Код, который вы предоставили, не запускает событие дважды:
http://jsfiddle.net/kNL6E/ (нажмите Save
)
Возможно, вы включили Angular дважды? Если вы это сделаете, вы получите два предупреждения, показанные здесь:
Я использую 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>
КОНТРОЛЛЕР
var app = angular.module('regApp', ['ui']);
app.controller('RegistrationCtrl', function ($scope, $http) {
$scope.PostRegistration = function () {
alert('click '); <--- fires twice
/// some code here --
};
Он должен срабатывать только один раз. Как я могу узнать, почему это происходит и как это исправить?
Код, который вы предоставили, не запускает событие дважды:
http://jsfiddle.net/kNL6E/ (нажмите Save
)
Возможно, вы включили Angular дважды? Если вы это сделаете, вы получите два предупреждения, показанные здесь:
У меня была похожая проблема, но я не смог найти, где я дважды включил Angular в свои файлы.
Я использовал вызовы ajax для загрузки определенных макетов форм, поэтому мне нужно использовать $compile
для активации Angular на вставленном DOM. Однако я использовал $compile
в моей директиве $element
, к которой подключен контроллер. Оказывается, это "включает" контроллер дважды, вызывая два триггера с ng-click
или ng-submit
.
Я исправил это, используя $compile
непосредственно на вставленном DOM вместо моей директивы $element
.
Такая же проблема с использованием
<a ng-click="fn()"></a>
fn вызывается дважды
С помощью кнопки исправлено:
<button ng-click="fn()"></button>
Это, вероятно, неясно, но у меня была стрелка ng-click
, потому что у меня был запуск BrowserSync, который отражал бы мои входы на вкладке, которую я открывал в другом окне, тем самым удваивая все мои клики. Чтобы решить проблему, я отключил "ghostMode": https://www.browsersync.io/docs/options/
Я решил это, удалив обработчик ngsubmit, поскольку мне это не нужно. Я отслеживаю события изменений и использую SignalR для обновления экрана почти в режиме реального времени.
Я тоже был в форме, а Документы AngularJS для ngSubmit:
Предупреждение. Будьте осторожны, чтобы не вызывать "двойное подчинение", используя вместе с обработчиками
ngClick
иngSubmit
. См. Формулу директивная документация для подробного обсуждения того, когдаngSubmit
может быть запущено.
Если кто-то имеет такую же проблему: Это была моя проблема:
<a type="submit" ng-click="login()">submit login<a>
Оба, type="submit"
и ng-click="login()"
вызвали метод login() в моем контроллере.
Поэтому просто используйте директиву type = submit или ng-click
Если другие ответы не помогают, убедитесь, что профилирование AngularJS отключено в Batarang (если вы его установили, конечно).
Это сделало ng-click для запуска дважды для меня.
элементы обернуты друг на друга, и это может вызвать триггерное событие дважды или более.
Итак, я использовал простой трюк CSS для этого решения:
.off{
pointer-events:none;
}
и применить его к элементу, соответствующему событию click.
Я получил его, когда я случайно вызвал $compile для динамически добавленных элементов несколько раз в цикле, а не только один раз. Компиляция только однажды удалила этот эффект.
столкнулся с такой же проблемой. Узнайте, что они использовали 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>
Я изменил < button ng-click = 'clickHandler()' > на < ng-click = 'clickHandler()' > и теперь событие срабатывает только один раз
У вас может быть ng-щелчок внутри контейнера формы с помощью ng-submit. В этом случае добавьте type = "button" для всех ваших, используя ng-click.
У меня была такая же проблема при динамическом введении частичных представлений в моем SPA (Single Pages Applications). Как я решил, это было сохранить содержимое моего div в локальной переменной следующим образом:
var html = $("#leftContainer").html();
Затем выпустите div и reset его содержимое следующим образом:
$("#leftContainer").empty();
$("#leftContainer").append(html);
Теперь вы можете добавить любой дополнительный html, который вы получили от вызова AJAX или динамически сконструировали, и, наконец, помните, что нужно перекомпилировать 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);
Я немного фиктивный и имел это:
<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>
Событие click запускалось дважды. Я переместил 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>
Эта ситуация может быть вызвана отсутствием ngTouch в Angular.
Событие, если загружено ngTouch, ошибка в ngTouch и ngClick до Angular 1.5.0. Это связано с тем, что ngClick запускается pointerup
и mouseUp
в Chrome для рабочего стола на панели инструментов устройства или на мобильном устройстве.
У меня тоже была проблема.
<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()">
Правильно, и он будет вызываться только один раз.
Я не знаю, в чем причина этого, но мне пришлось использовать event.stopPropagation();
внутреннюю мою функцию JavaScript.
HTML
<button class="button" ng-click="save($event)">Save</button>
JAVASCRIPT
function save(event) {
event.stopPropagation();
}
HTML:
<div>
<ui>
<li>
<button class="Button" ng-disabled="self.desableSubmitButton" ng-
click="self.SubmitClick($event)">Submit</button>
</li>
</ui>
</div>
Angular 1.0 Controller:
_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
}