2016-01-06 3 views
0

Я работаю над приложением NodeJS/ExpressJS с помощью JQuery Mobile (JQM). У меня возникли проблемы с перенаправлением с сервера. Мое приложение динамически генерирует кнопкиNodeJS Перенаправление с одной страницей JQuery Mobile

<button class=\"setAttndingbtn btn btn-primary\" value=\"" + curr.place_id + "\">Attending: " + numAttending.numAttnd + " people are going</button>

после поиска $ .getJSON производится. Использование обещаний/SetTimeout, следующий обработчик присоединяется ко всем кнопкам:

$('.setAttndingbtn').click(function(){ 
    var buttonsir = $(this); //Store this button reference 
    if($(this).html().slice(0,1) == 'A'){ //Check the button's state 
     $.getJSON('/api/attending/' + $(this).val(), function(data){ //Ajax 
      $(buttonsir).text("You are attending! " + data.numAttnd + " people are going"); //Change state 
         }); 
    } else { 
     $.getJSON('/api/attending/rmv/' + $(this).val(), function(data){ 
      $(buttonsir).text("Attending: " + data.numAttnd + " people are going"); 
         }); 
        } 
       }); 

Соответствующие маршруты здесь:

function isLoggedIn(req, res, next){ 
    if(req.isAuthenticated()){ 
     return next(); 
    } else { 
     res.redirect('/login'); 
    } 
} 

    app.route('/login') 
    .get(function(req, res){ 
     res.sendFile(p + "/public/login.html"); 
    }); 

    app.route('/api/attending/:number') 
    .get(isLoggedIn, searchServerInstance.setAttending); 

На внутреннем интерфейсе, когда «придет» кнопка нажата, я хочу проверьте, зарегистрирован ли пользователь, а если нет, перенаправляйте их на страницу входа в систему. Когда я запускаю код как есть, в Firefox Firebug консоли, я вижу запрос GET, и если я его разворачиваю, в разделе «Ответ» отображается код HTML на мою страницу входа. Но страница фактически не загружает файл.

У моего /login.html есть <div data-role="page">, заголовки и теги контента, как рекомендует JQM. Я попытался включить всю страницу входа в мой /index.html, но попытка использовать res.redirect("/public/index.html#page2") приводит к «файлу, который не найден».

Можно ли использовать узел/экспресс, чтобы сообщить JQM, который загружается <div data-role="page" id="page1">? Есть ли способ заставить JQM загружать /login.html с серверной стороны, способ rel="external" позволяет? Или мне придется вырезать JQM?

+0

Как насчет прямой отправки файла в раздел else, где делаются перенаправления. Пожалуйста, проверьте. –

+0

@GandalftheWhite Я просто попробовал 'isLoggedIn() {...} else {res.sendFile (p +' /public/login.html ')} и имел ту же проблему, консоль показывает файл HTML, как в ответе GET , но страница не загружает его. –

+0

Так что я догадался xD. Что вы используете в передней части? –

ответ

0

Чтение документации JQM, я выяснил некоторые способы сделать это. Для всех, кто сталкивается с его, вот что я думаю, что я понимаю:

  1. Если вы не заботитесь о сохранении целостности одной-страницы, вы можете посмотреть в выключая JQM's defaults, как ajaxEnabled, который выключает JQM-хэш-прослушивание и ajax, загрузка URL-адресов обычно. Я не знаю, работает ли это с res.redirect Express, потому что я этого не пробовал.
  2. Что я решил сделать, это заменить res.redirect('/login.html') на пользовательский ответ JSON res.send({loginState: "LOGIN"}). Затем, на стороне клиента, в пределах моих $.getJSON запроса в $('.setAttndngbtn') слушателя, я поставил следующий код:

.

if(data.loginstate !== "LOGIN"){ 
      $(buttonsir).text("You are attending! " + data.numAttnd + " people are going"); 
} else { 
      $(":mobile-pagecontainer").pagecontainer("change", '#page2'); 
} 

И все работает отлично! Вот документация JQM на виджетах pagecontainer, которая позволяет перенаправлять на страницу с помощью метода change или внешнего перенаправления с помощью метода load.

Смежные вопросы