jQuery MVC — базовый оператор jQuery if else, который НЕ МОЖЕТ работать?

#javascript #jquery #model-view-controller

#javascript #jquery #модель-представление-контроллер

Вопрос:

Я получил сценарий if-else:

      $('#favitem').live('click', function () {
        var fid = $(this).parent().attr('id');

        if (isFav(fid)) {
            alert("Do you want to remove from favorite?");
        }
        else {
            alert("Add to favorite?");
        }
    });
  

вызов функции скрипта isFav:

     function isFav(fid) {

    $.ajax({

        url: '/Stock/IsFav',
        type: 'GET',
        data: { id: fid },
        success: function (result) { return resu< }
    });
}
  

что, в свою очередь, вызывает действие моего контроллера:

     public Boolean IsFav(int id)
    {
        var food = dbEntities.FOODs.Single(f => f.FoodID == id);
        if (food.FavFlag == 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  

Кажется, все работает нормально, я получаю true от firebug, НО я получаю предупреждающее сообщение от оператора else. Оператор if просто никогда не вводится.
Я не могу понять, что здесь не так. Есть идеи?? Пожалуйста, помогите..

Ответ №1:

Запрос ajax в isFav является асинхронным, и метод isFav вернется до его завершения.

Вероятно, так я бы решил это:

 function isFav(fid, callback) {
    $.ajax({
        url: '/Stock/IsFav',
        type: 'GET',
        data: { id: fid },
        success: function (result) { callback(result); }
    });
}


 $('#favitem').live('click', function () {
    var fid = $(this).parent().attr('id');

    isFav(fid,function(result){
        if(result amp;amp; result.toLowerCase() == "true"){
            alert("Do you want to remove from favorite?"); 
        } else {
            alert("Add to favorite?");  
        }
    });
});
  

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

Комментарии:

1. Привет .. я ценю это … но это не работает… Я получаю все предупреждения от If, но никогда не получаю от else…

2. Это потому, что возвращаемые данные представляют собой строку, а не логическое значение. Если только проверяет, что результат не равен нулю, и поэтому всегда возвращает true . Я обновил свой ответ, чтобы решить эту проблему.

3. Большое спасибо!! результат amp;amp; результат. toLowerCase() == «true» это ключ к тому, чтобы он работал, очень ценю вашу помощь .. спасибо!

Ответ №2:

На самом деле вы не возвращаете true из функции isFav. Кроме того, ajax является асинхронным, поэтому ваш код (оператор if) фактически продолжает выполняться до завершения ajax, поэтому в момент выполнения результат isFav не определен. Так вот почему выполняется else.

Вам понадобится некоторая доработка.

 function isFav(fid) {

    $.ajax({

        url: '/Stock/IsFav',
        type: 'GET',
        data: { id: fid },
        success: function (result) {
          if(result == 'favorite') alert("Do you want to remove from favorite?");
          else alert("Add to favorite?");
        }
    });
}

 $('#favitem').live('click', function () {
    var fid = $(this).parent().attr('id');
    isFav(fid);
});
  

Комментарии:

1. Я получу предупреждающее сообщение от if, я не могу ввести else

2. Да, хорошо, убедитесь, что условие выполнено. Каким должен быть результат, когда элемент является любимым? Исправьте условие в форме, которую я отредактировал выше.

3. ПРИВЕТ, я изменил условие на true и false, теперь отображается оператор else, if никогда не вводится… пожалуйста, помогите…