Почему вызов alert () вызывает повторное запуск моего события? - PullRequest
1 голос
/ 02 мая 2020

Я работаю через этого урока . Я пришел к той части, где я добавляю обработчик событий для флажков. У меня были некоторые проблемы с этим, поэтому я добавил вызовы alert (), чтобы увидеть, что скрипт выполняется. У меня также есть вызовы Console.WriteLine () в моем контроллере, чтобы сообщить, когда ящик был успешно обработан и когда он вышел из строя.

Когда у меня есть вызов alert () в функции markCompleted (), сообщение появляется дважды. И в окне консоли, из которого запускается проект, я сначала вижу отчет об успехе, а затем отчет об ошибке. Похоже, что при наличии вызова alert () событие click для флажка запускается дважды. Это почему? Когда я удаляю вызов alert (), я получаю только одно сообщение в окне консоли, и операция завершается успешно.

Вот JavaScript учебник, который мне нужно было вставить:

$(document).ready(function () {
    // Wire up all of the checkboxes to run markComnpleted()
    //alert("Document ready function");
    $('.done-checkbox').on('click', function (e) {
        markCompleted(e.target);
    });
});

function markCompleted(checkbox) {
    alert("Mark completed function.");
    checkbox.disabled = true;
    var row = checkbox.closest('tr');
    $(row).addClass('done');
    var form = checkbox.closest('form');
    form.submit();
}

А вот код моего контроллера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

using AspNetCoreTodo.Services;
using AspNetCoreTodo.Models;

namespace AspNetCoreTodo.Controllers
{
    public class ToDoController : Controller
    {
        private readonly IToDoItemService _toDoItemService;

        public ToDoController(IToDoItemService toDoItemService)
        {
            _toDoItemService = toDoItemService;
        }

        public async Task<IActionResult> Index()
        {
            // Get to-do items from database
            var items = await _toDoItemService.GetIncompleteItemsAsync();

            // Put items into a model
            var model = new ToDoViewModel()
            {
                Items = items
            };

            // Render view using the model
            return View(model);
        }

        [ValidateAntiForgeryToken]
        public async Task<IActionResult> AddItem(ToDoItem newItem)
        {
            if (!ModelState.IsValid)
            {
                return RedirectToAction("Index");
            }

            var successful = await _toDoItemService.AddItemAsync(newItem);
            if (!successful)
            {
                return BadRequest("Could not add item.");
            }

            return RedirectToAction("Index");
        }

        [ValidateAntiForgeryToken]
        public async Task<IActionResult> MarkDone(Guid id)
        {
            if (id == Guid.Empty)
            {
                Console.WriteLine("Received invalid or empty Guid");
                return RedirectToAction("Index");
            }

            bool successful = await _toDoItemService.MarkDoneAsync(id);
            if (!successful)
            {
                Console.WriteLine("Failed to mark item as done.");
                return BadRequest("Could not mark item as done.");
            }

            Console.WriteLine("Item marked done.");
            return RedirectToAction("Index");
        }
    }
}

Наконец, вот код из службы:

    public async Task<bool> MarkDoneAsync(Guid id)
    {
        var item = await _context.Items
                                 .Where(x => x.Id == id)
                                 .SingleOrDefaultAsync();
        if (item == null)
            return false;

        item.IsDone = true;

        int saveResult = await _context.SaveChangesAsync();
        return saveResult == 1;
    }

1 Ответ

0 голосов
/ 02 мая 2020

Может быть одна из этих двух проблем: 1. Вы включили как мин. js, так и js, и, таким образом, это дважды связывает событие. Чтобы исключить это, используйте unbind на клик перед добавлением, и в этом случае это должно произойти один раз. 2. Если это не помогает, ваше событие может распространяться на родительский элемент, вы должны попробовать e.PreventDefault () перед вызовом markcompleted, чтобы исключить это.

...