Упростить JavaScript для перенаправления логических функций


У меня есть файл JavaScript, который является уродливым, но я не представляю, как сделать его лучше. Есть много функции для перенаправления с разным количеством параметров. Просто некоторые функции используются для других думает. Все эти функции будут вызваны из событий jQuery. Как это:

$("#btnSomeButtonID").click(function () { SelectPTO(); });

Я хотел бы упростить логику. У вас есть какие-либо идеи для рефакторинга? Спасибо за вашу помощь.

// Require refactoring, all is  public. Need to investigate what is best way.

var pushupdatesList; //public
var pushupdatesListRun = true;//public
var loading = false;//public

// functions with 0 parameters
function StartLoading() {
    if (loading)
        return;

    loading = true;
    $("#loadingbar").show();
}

function StopLoading() {
    loading = false;
    $("#loadingbar").hide();
}

// redirect functions with 0 parameters
function OpenAddCompany() {
    location.href = "/Administration/AddCompany";
}

function OpenAdminTools() {
    StartLoading();
    location.href = "/Administration/GetCompanies";
}

function Logout() {
    StartLoading();
    AbortPushUpdates();
    loading = 0;
    location.href = "/Home/Logoff";
}

function SelectPTO() {
    StartLoading();
    AbortPushUpdates();
    loading = 0;
    location.href = "/Home/SelectEquipmentCollection";
}

function OpenChangePassword() {
    StartLoading();
    loading = 0;
    location.href = "/Home/ChangePassword";
}

// functions with 1 parameter
function OpenGetPTOs(ID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/GetEquipmentCollections/" + ID;
}

function OpenAddPTO(ID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/AddEquipmentCollection/" + ID;
}

function OpenGetAccountsForCompany(ID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/GetAccountsForCompany/" + ID;
}

function OpenAddAccount(ID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/AddAccount/" + ID;
}

// functions with 2 parameters
function OpenGetAccountsForPTO(ID, CompanyID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/GetAccountsForEquipmentCollection/" + ID + "?CompanyID=" + CompanyID;
}

function OpenAddAccountToPTO(ID, CompanyID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/AddAccountToEquipmentCollection/" + ID + "?CompanyID=" + CompanyID;
}

function OpenGetVehiclesForPTO(ID, CompanyID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/GetEquipmentForCollection/" + ID + "?CompanyID=" + CompanyID;
}

function OpenAddVehicleToPTO(ID, CompanyID) {
    StartLoading();
    loading = 0;
    location.href = "/Administration/AddEquipmentToCollection/" + ID + "?CompanyID=" + CompanyID;
}


116
1
задан 23 марта 2018 в 01:03 Источник Поделиться
Комментарии
1 ответ

Первое, что я вижу, что сократит файл как минимум в полтора раза делает один redirectToPage функция, которая перенаправляет на данной странице. У вас есть много копий одной и той же базовой функции, которая в настоящее время выглядит так

function functionName(params) {
StartLoading();
loading = 0;
location.href = "someURL"
}

Когда вы видите подобный блок кода, как это повторяется несколько раз, это хорошее время, чтобы рефакторинг (это спорно, но я бы рассмотреть возможность рефакторинга по 2 повторений, и наверняка рефакторинг на 3). Ваша новая функция будет

function redirectToPage(url) {
StartLoading();
loading = false; // explained below
location.href = url;
}

Теперь вы можете удалить большую часть этого файла, используя еще одну универсальную функцию и передав URL-адреса в качестве аргументов.

Вы также используете loading как булево иногда, а иногда как целое. Ваш код будет проще, если вы будете придерживаться одного. Похоже, вы используете только loading как логическое, так что я изменил loading = 0 для loading = false. Вы можете сделать это изменение во всем остальном файла.

Это может быть достаточно изменения для вас. Если нет, есть несколько других функций, которые у вас есть, что перенаправление на страницу, но с несколько разных функций, таких как вызов AbortPushUpdates или не устанавливать loading переменной. Вы можете продлить ваш новый redirectToPage функции для обработки таких случаев, как так

/**
* Call this function giving the url to redirect to, and other options
*/
function redirectToPage(url, options) {
if (!options || !options.hasOwnProperty('startLoading') || options.startLoading == true) {
// default is to run StartLoading()
StartLoading();
}

if (options && options.hasOwnProperty('abortPushUpdates') && options.abortPushUpdates) {
// default is to NOT call AbortPushUpdates
AbortPushUpdates();
}

if (!options || !options.hasOwnProperty('setLoading') || options.setLoading == true) {
// default is to set the loading variable
loading = false;
}

// Always redirect
location.href = url;
}

Теперь вы можете использовать эту функцию в любом из следующих способов

redirectToPage('/Administration/AddAccount/' + accountID);
redirectToPage('/Administration/AddCompany', {setLoading: false, startLoading: false})
redirectToPage('/Home/SelectEquipmentCollection', {abortPushUpdates: true})

Удачи вам с вашим рефакторинг, и дайте мне знать если вы имеете любые вопросы!

3
ответ дан 23 марта 2018 в 02:03 Источник Поделиться