#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 никогда не вводится… пожалуйста, помогите…