Почему моя функция перестает работать без предупреждения? - PullRequest
1 голос
/ 12 февраля 2020

Итак, у меня есть эта функция, на мой взгляд:

function izbrisi() {
        var b = document.getElementById('proizvod').value;
        {
            $.ajax({
                url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
                data: { id: b }
            }).done(function () {
                alert('Izbrisan');
                });
            alert('Izbrisan');  @* bez ovoga se ne brise proizvod *@
        }
    }

Контроллер, которому он передан:

public ActionResult izbrisiProizvod(int Id)
        {
            RadniProizvod.IzbrisiProizvod(Id);
            return View();
        }

И, наконец, метод "ИзбрисиПроизвод":

public void IzbrisiProizvod(int IdProizvoda)
        {
            Proizvod izbrisaniProizvod = azilEntities.Proizvods.FirstOrDefault(x => x.idProizvoda == IdProizvoda);
            azilEntities.Proizvods.Remove(izbrisaniProizvod);
            azilEntities.SaveChanges();
        }

По любой причине, если я не добавлю последнее предупреждение (то, где есть комментарий), код просто не будет работать. Ничто не удаляется, ничего не сообщается консоли. Как только я добавлю последнее предупреждение, оно волшебным образом начнет работать.

Может кто-нибудь объяснить мне это волшебство c?

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Всегда пишите свои jquery функции, подобные этой, согласно документации. (Всегда необязательно)

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax( "example.php" )
  .done(function() {
    alert( "success" );
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    alert( "error" );
  })
  .always(function() {
    alert( "complete" );
  });

Так что в вашем случае:

function izbrisi() {
        var b = document.getElementById('proizvod').value;
        {
            $.ajax({
                url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
                data: { id: b }
            }).done(function () {
                alert('Izbrisan');
            }).fail(function() {
                   alert( "error" );
            }).always(function() {
                   alert( "complete" );
           });
        }
    }

И, возможно, измените оповещения на консольный журнал или аналогичный.

0 голосов
/ 14 февраля 2020

Попробуйте сетевой инструмент в вашем браузере. Например, для Firefox Dev Tools . Когда вы щелкаете по своему элементу (скажем, по кнопке), вы должны увидеть новый http-запрос в списке всех запросов в Network tool. Если вы этого не сделаете, то ваш ajax звонок не состоялся вообще или это было на предыдущей странице, потому что вы испытали перезагрузку страницы. Проверьте, действительно ли Производ удален. Если это так, ваша функция js работает, но вы не видите ответа. Если в сетевом инструменте есть новый запрос http, немного осмотрите его, чтобы увидеть, что происходит (просто нажмите на него, и справа вы увидите подробности).

Кроме того, вы можете открыть консоль и вместо этого щелкните тип элемента html в консоли: izbrisi(). Функция должна быть выполнена, и если она сработает, вы увидите новый http-запрос в Network tool, и появится предупреждение для done. Если это так, то ваш элемент html имеет поведение по умолчанию для события click. Таким образом, вы должны предотвратить это, чтобы предотвратить перезагрузку страницы. Допустим, вы используете кнопку для нажатия на нее. Кнопка html должна выглядеть следующим образом:

<button onclick="izbrisi(e)">Izbrisi</button>

И функция js:

function izbrisi(e) {
   e.preventDefault();
   // ... your code goes here
}
0 голосов
/ 12 февраля 2020

По какой-то причине, если я не добавлю последнее предупреждение (то, где есть комментарий), код просто не будет работать. Ничто не удаляется, ничего не сообщается консоли. Как только я добавлю последнее предупреждение, оно волшебным образом начнет работать.

Ваш ajax содержит только обратный вызов .done(). Это будет выполнено только в том случае, если запрос ajax получит 200 кодов успеха. Вы можете добавить к обещанию .fail() уникальное оповещение, чтобы увидеть, что происходит.

В вашем коде последнее оповещение сработает независимо от того, что.

Попробуйте, чтобы помочь увидеть что здесь происходит. Используйте эту скрипку и также откройте консоль. Обратите внимание на различные предупреждающие сообщения в обещаниях .done() и .fail().

  //var b = document.getElementById('proizvod')?.value;
  $.ajax({
    url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
    data: {
      id: 'someData'
    }
  }).done(function() {
    alert('success');
  }).fail(function() {
    alert('error');
  });

  console.log('i fire no matter what');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...