Пользовательская функция вызывается еще раз при каждом нажатии - PullRequest
2 голосов
/ 30 апреля 2019

Я новичок в Angular JS, и я настроил базовую HTML-страницу с таблицей элементов.Я хочу иметь возможность удалять каждый элемент отдельно, поэтому я добавил столбец, содержащий кнопку удаления, для каждой строки моей таблицы HTML.Вот как выглядит этот столбец.

<td headers="deleteRoleHeader" class="cell-texte">
    <span class="glyphicon glyphicon-trash" ng-click="deleteRole();"></span>
</td>

И моя функция Angular JS:

$scope.deleteRole = function(){
    var data = {
                codeRole: $scope.code_role,
                descRole : $scope.desc_role
               };
    console.log(data);
};

Моя проблема заключается в том, что каждый раз, когда я нажимаю кнопку удаления, моя функция вызывается еще разчем в прошлый раз.Чтобы уточнить: при первом щелчке функция вызывается один раз, при втором нажатии функция вызывается дважды и т. Д.

Мне бы хотелось, чтобы моя функция вызывалась только один раз, когда я нажимаю кнопку удаления.

Кто-нибудь сталкивался с подобной проблемой?Я прочитал много вопросов о стековом потоке о функциях, вызываемых несколько раз, но мне не удалось решить эту проблему.

Заранее благодарен за помощь.

РЕДАКТИРОВАТЬ: вот моя консольвывод после двух кликов Example

РЕДАКТИРОВАТЬ 2: Я выяснил, в чем причина проблемы: у меня настроен модал, выступающий в качестве подтверждения, и если я его уберумой код ведет себя так, как и должен (только один вызов функции) Вот скрипка, которая воспроизводит проблему: https://jsfiddle.net/w6edum0f/12/.

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.roles = [
{
    "codeRole": "test",
    "descRole": "test desc"
  },
  {"codeRole": "test2",
    "descRole": "test desc1"
  }
];
  $scope.selectRole = function(role) {
    $scope.code_role = role.codeRole;
    $scope.desc_role = role.descRole;
  };

    $scope.deleteRole = function(){
        $('#deleteModal').show();
        $('#deleteBtn').click(function(){
            $('#deleteModal').hide();
            var data = {
                codeRole: $scope.code_role,
                descRole : $scope.desc_role
            };
            console.log(data);
        });
    };
});

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

при первом нажатии, функция вызывается один раз, при втором нажатии, функция вызывается дважды и т. Д.

Это происходит потому, что код добавляет еще один обработчик нажатия при каждом вызове:

ERRONEOUS

$scope.deleteRole = function(){
    $('#deleteModal').show();
    $('#deleteBtn').click(function(){
        $('#deleteModal').hide();
        var data = {
            codeRole: $scope.code_role,
            descRole : $scope.desc_role
        };
        console.log(data);
    });
};

Одним из решений является удаление обработчика щелчка, который вызывался:

$scope.deleteRole = function(){
    $('#deleteModal').show();
    $('#deleteBtn').on("click", hideModal);
};
function hideModal(){
    $('#deleteModal').hide();
    $('#deleteBtn').off("click", hideModal); 
    var data = {
        codeRole: $scope.code_role,
        descRole : $scope.desc_role
    };
    console.log(data);
};
0 голосов
/ 30 апреля 2019

хорошо, ребята, я пытаюсь создать небольшое угловое приложение и запустить этот код, чтобы мы были в одном контексте:

ссылка на jsfiddle https://jsfiddle.net/dupinderdhiman/nd8wm5pg/1/

ПРИЧИНА: Причиной является всплывающее окно, когда мы нажимаем кнопку okay в диалоговом окне, которое открывается после нажатия delete, затем начинается всплывающее окно, поэтому для обработки всплывающего сообщения я пытаюсьследующий трюк, вы можете попробовать другой, если хотите: P

  $scope.deleteRole = function(){
         $('#deleteModal').show();
         var isDeleteBtnClicked = false;
            $('#deleteBtn').click(function($event){
                if(!isDeleteBtnClicked)
                {
                    $('#deleteModal').hide();
                    var data = {
                        codeRole: $scope.code_role,
                               descRole : $scope.desc_role
                           };
                    console.log(data);
                    isDeleteBtnClicked = true;
                }

        });
    };

И следующий фрагмент кода:

    <!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<body>

<div ng-app="myApp" ng-controller="myCtrl">
  <table>
    <thead>
      <tr>deleteRole
        <th><span>Code</span>
        </th>
        <th><span>Description</span>
        </th>
        <th>
          Suppression
        </th>
      </tr>
    </thead>

    <tbody>
      <div>
        <div>
          <tr ng-repeat="role in roles" 
          ng-click="selectRole(role);">
            <td>{{ role.codeRole }}</td>
            <td>{{ role.descRole }}</td>
            <td>
              <span title="Supprimer le rôle" 
              ng-click="deleteRole();">Delete</span>
            </td>
          </tr>
        </div>
      </div>
    </tbody>
  </table>

<div id="deleteModal" class="modal" tabindex="-1" role="dialog">
			<div class="modal-dialog" role="document">
				<div class="modal-content">
					<div class="modal-header">
						<h1 class="modal-title">Confirmation</h1>
							<button type="button" class="close" data-dismiss="modal" aria-label="Close">
								<span aria-hidden="true">&times;</span>
							</button>
					</div>
					<div class="modal-body">
						<p>Voulez-vous supprimer l'élément ?</p>
					</div>
					<div class="modal-footer">
						<button type="button" id="deleteBtn" class="btn btn-primary">Supprimer</button>
						<button type="button" id="cancelDeleteBtn" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
					</div>
				</div>
			</div>
		</div>


</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.roles = [
{
    "codeRole": "test",
    "descRole": "test desc"
  },
  {"codeRole": "test2",
    "descRole": "test desc1"
  }
];
  $scope.selectRole = function(role) {
    $scope.code_role = role.codeRole;
    $scope.desc_role = role.descRole;
  };

    $scope.deleteRole = function(){
	     $('#deleteModal').show();
		 var isDeleteBtnClicked = false;
		    $('#deleteBtn').click(function($event){
				if(!isDeleteBtnClicked)
				{
					$('#deleteModal').hide();
					var data = {
						codeRole: $scope.code_role,
							   descRole : $scope.desc_role
						   };
					console.log(data);
					isDeleteBtnClicked = true;
				}
        
        });
    };
});
</script>

</body>
</html>

, если все еще есть сомнения, пожалуйста, дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...