Как сохранить вид интерфейса при загрузке страницы? - PullRequest
0 голосов
/ 20 мая 2018

Вкл. отправить событие Я настроил некоторые вещи из полученных данных , которые я хотел бы сохранить, когда я обновляю страницу и даже когда я это делаючто я делаю (с , если sessionStorage.token ), это не работает.Я делал точно такой же сценарий с Javascript и раньше, и клянусь, это сработало.

Как это можно решить?Пожалуйста, помогите мне.

            // Initialize variables
            var $jUser = {};
            var $ajUsers = [];

            // Login POST 
            $('#frm-login').submit(function (e) {
                event.preventDefault()
                $loginButton.text('Please wait ...').prop('disabled')
                $.ajax({
                    url: "/login-user",
                    type: "POST",
                    data: $('#frm-login').serialize(),
                dataType: "json"
            }).always(function (response) {
                $loginButton.text('Logging in').prop('disabled')
                console.log("Login", response)
                if (response.status == "error") {
                    $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
                    return
                }
                sessionStorage.setItem('token', response.token)
                if (sessionStorage.token) {
                    $.ajax({
                        type: "GET",
                        url: "/verify-user",
                        headers: {
                            'Authorization': 'Bearer ' + sessionStorage.token
                        },
                        dataType: "json"
                    }).always(function (response) {
                        console.log("Auth", response)
                        if (response.status == "error") {
                            $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
                            return

                        }
                        $('#index-page').css('display', 'none')
                        $('#main-page').css('display', 'block')
                        $.getScript('/js/socket.js', function () {
                            console.log('script loaded');
                        });
                        $jUser = response.authData.user
                        $userAvatar.attr('src', $jUser.avatar)
                        $userFullname.text($jUser.first_name + ' ' + $jUser.last_name)
                        console.log($jUser)
                    })
                }
            })
        })
        console.log($jUser)
        if (sessionStorage.token) {
            function userSession() {
                $('#index-page').css('display', 'none')
                $('#main-page').css('display', 'block')
                $userAvatar.attr('src', $jUser.avatar)
                $userFullname.text($jUser.first_name + ' ' + $jUser.last_name)
                console.log('hello')
            }
        }

1 Ответ

0 голосов
/ 20 мая 2018

Во-первых, вы, кажется, нигде не вызываете функцию userSession.Вы определяете его только в окончательном тесте токена.

Кроме того, вы вызываете always для jqXHR, возвращенного вызовом $.ajax.Метод always будет вызван независимо от того, успешен ли запрос ajax, и передаст предоставленные функции различные аргументы, в зависимости от состояния запроса.См. документацию по отложенному методу jQuery .Я думаю, что вы хотите использовать атрибут success параметров $.ajax для достижения того, что вы хотите.

Наконец, я не вижу, где вы устанавливаете $jUser, но ваш код, кажется, предполагаетоно сохраняется при загрузке страниц.Однако он сбрасывается на пустой объект ({}) каждый раз, когда выполняется ваш javascript (при каждой загрузке страницы).Вы можете захотеть его сериализовать и сохранить в объекте sessionStorage, чтобы он сохранялся, затем протестируйте его и отмените сериализацию до $jUser, если он сохранен.Кроме того, вы можете вызывать verifyUser при каждой загрузке страницы, используя сохраненный токен, если он существует, что будет менее эффективно, но должно работать.

Не имея доступа к серверу для вызовов Ajax, я не могу проверить свои изменения в вашем коде, но я все равно опубликую их, и вы можете попробовать их самостоятельно.Дайте мне знать, если это поможет.

// Initialize variables
var $jUser = {};
var $ajUsers = [];
var jUserJSON;

function failedLogin() {
    // handle failed logins
    $loginButton.removeClass('lime').addClass('red').text('Log in failed. Try again.');
    $loginButton.text('Login').prop('disabled', false);
}

function ajaxError(url, testStatus, errorThrown) {
    console.log("The " + url + " Ajax request failed. status:" + textStatus + ', errorThrown: ' + errorThrown);
}

function updatePageWithLogin() {
    $('#index-page').css('display', 'none');
    $('#main-page').css('display', 'block');
    $userAvatar.attr('src', $jUser.avatar);
    $userFullname.text($jUser.first_name + ' ' + $jUser.last_name);
    $.getScript('/js/socket.js', function () {
        console.log('script loaded');
    });
}

function verifyUser(token) {
    $.ajax({
        type: "GET",
        url: "/verify-user",
        headers: {
            'Authorization': 'Bearer ' + token
        },
        dataType: "json",
        success: function (response) {
            console.log("Auth", response)
            if (response.status == "error") {
                failedLogin();
                return;
            }

            $jUser = response.authData.user;

            // persist the $jUser object
            jUserJSON = JSON.stringify($jUser);
            sessionStorage.setItem('juser', jUserJSON);
            console.log("$jUser: " + jUserJSON);
            updatePageWithLogin();
        },
        error: function(jqXHR, textStatus, errorThrown) {
            ajaxError("/verify-user", textStatus, errorThrown);
        },
        complete: function() {
            // This will get called whether the Ajax request succeeds or fails
        }
    });
}

// Login POST
$('#frm-login').submit(function (e) {
    event.preventDefault();
    $loginButton.text('Please wait ...').prop('disabled');
    $.ajax({
        url: "/login-user",
        type: "POST",
        data: $('#frm-login').serialize(),
        dataType: "json",
        success: function(response) {
            $loginButton.text('Logging in').prop('disabled', true);
            console.log("Login", response)
            if (response.status == "error") {
                failedLogin();
                return;
            }
            sessionStorage.setItem('token', response.token); // not sure this is necessary now
            if (response.token) { verifyUser(response.token) }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            ajaxError("/login-user", textStatus, errorThrown);
        },
        complete: function() {
            // This will get called whether the Ajax request succeeds or fails
        }
    })
});

jUserJSON = sessionStorage.getItem("juser");

if (jUserJSON) {
    // The user has already authenticated
    $jUser = JSON.parse(jUserJSON);
    updatePageWithLogin();
}

console.log("$jUser: " + jUserJSON);
...