возникли проблемы с преобразованием процедурного JavaScript в версию с более ООП-кодом - PullRequest
0 голосов
/ 26 марта 2019

В настоящее время я построил систему «Добавить больше», чтобы генерировать больше полей для пользователей в форме, а затем проверять строку запроса в случае сбоя формы. Однако это делается более процедурным образом, так как каждая версия является своей собственной, что приводит меня к дублированию аналогичного кода примерно 5 раз (по одному для каждой версии и для каждой функции), и мне было интересно, не могли бы вы помочь мне преобразовать его в более ООП, поэтому только один набор кода облегчает выполнение в моей системе и, таким образом, не заставляет меня запускать так много кода и более упрощенный код

Я пытался сделать это несколько ООП, но я продолжаю получать ошибки, потому что я не очень хорош в JavaScript или ООП, я получил его для работы с базовым JavaScript, но это означает, что у меня так много дополнительных строк кода

Итак, вот базовый код, который работает, как показано, он будет продублирован еще 3 раза после этих

<script>
<!-- MORE BIKES -->
var max_fields_morebikes = 4;
var wrapper_bike = $("#currentbikes");
var add_button_morebikes = $("#morebikes");
var counter_bikes = 1;

<!-- add and delete for morebikes -->
$(add_button_morebikes).click(function (e) {
    e.preventDefault();
    if (counter_bikes < max_fields_morebikes) {
        counter_bikes++;
        $(wrapper_bike).append('<div class="morebikesadd"><input type="text" name="currentbike[]" class="currentbikesadd" placeholder="Current Bikes" ><button class="delete">Delete</button></div>');
        //add input box
    } else {
        alert('You Reached the limits')
    }
});
$(wrapper_bike).on("click", ".delete", function (e) {
    e.preventDefault();
    $(this).parent('div').remove();
    counter_bikes--;
});
</script>

, а также есть версии, где добавляются 2 набора входов

<script>
<!-- RACES HISTORY -->
var max_fields_racehist = 5;
var wrapper_racehist = $("#racinghistoryresults");
var add_button_racehist = $("#moreracehist");
var counter_racehist = 1;

<!-- add and delete for RaceHistory -->
$(add_button_racehist).click(function (e) {
    e.preventDefault();
    if (counter_racehist < max_fields_racehist) {
        counter_racehist++;
        $(wrapper_racehist).append('<div style=" margin-top: 10px; margin-bottom: 10px;"><input type="text" name="racehist[]" class="racehist addmoreracehistory" placeholder="Race History">&nbsp;<input type="text" name="results[]" class="results addmorementionableresults" placeholder="Mentionable Results">&nbsp;<button class="delete">Delete</button></div>');
        //add input box
    } else {
        alert('You Reached the limits')
    }
});
$(wrapper_racehist).on("click", ".delete", function (e) {
    e.preventDefault();
    $(this).parent('div').remove();
    counter_racehist--;
});
</script>

Это метод, который я пробовал по крайней мере, если есть один вход

<button type="button" onclick="return addMoreRows(5,1, 'morebikesadd', 'currentbike','currentbikesadd','Current Bike', 'delete')"> Add More</button>
<script>
 function addMoreRows(numFields, maxCounter, addMoreClass, inputName, inputClass, placeHolderName,buttonClass){
        var max_fields = numFields;
        var wrapper = document.createElement("div");
        var counter = maxCounter;

        if (counter < max_fields) {
            counter++;
            wrapper.appendChild('<div class="' + addMoreClass + '"><input type="text" name="'+ inputName +'[]" class="'+ inputClass +'" placeholder="'+ placeHolderName +'"><button class="'+ buttonClass +'"> Delete </button></div>');
        }
        else {
            alert('You Have Reached the limits')
        }

    }
</script>

Я хочу знать, если это возможно, как я могу объединить его, чтобы он просто принимал значения, которые я ввел и работал, поэтому мне нужно только 1, возможно, 2 функции (зависит, если он может объединить только 1 вход и 2 входа) чтобы я мог сделать onclick=" addMoreRows(values,values,etc)", чтобы можно было сделать проще

1 Ответ

1 голос
/ 26 марта 2019

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

В вашем коде есть два типа: велосипеды и raceHistory . Они имеют похожие свойства, такие как maxLimit, currentCount, selector и html для нового элемента.
Таким образом, вы можете сделать object как показано ниже:

var itemTypes = {
    bike:{
        maxLimit: 4,
        currentCount: 1,
        selector: '#currentbikes',
        newElement: '<div class="morebikesadd"><input type="text" name="currentbike[]" class="currentbikesadd" placeholder="Current Bikes" ><button class="delete">Delete</button></div>'
    },
    raceHistory:{
        maxLimit: 5,
        currentCount: 1,
        selector: '#racinghistoryresults',
        newElement: '<div style=" margin-top: 10px; margin-bottom: 10px;"><input type="text" name="racehist[]" class="racehist addmoreracehistory" placeholder="Race History">&nbsp;<input type="text" name="results[]" class="results addmorementionableresults" placeholder="Mentionable Results">&nbsp;<button class="delete">Delete</button></div>'
    }
}

От вашего html просто отправьте ваш тип в качестве аргумента для вашей addMoreRows() функции, например, для bike используйте следующее:

<button type="button" onclick="return addMoreRows('bike')"> Add More Bike</button>

ИЛИ используйте следующее для raceHistory

<button type="button" onclick="addMoreRows('raceHistory')"> Add More Race History</button>

и управляйте от вашей addMoreRows() функции вот так

function addMoreRows(type){
    var item = itemTypes[type];
    if (item.currentCount < item.maxLimit) {
        item.currentCount++;
        $(item.selector).append(item.newElement);
    }
    else {
        alert('You Have Reached the limits')
    }
}

Hola! Все теперь обобщено!

Если вы хотите добавить другой тип, например, motorBike, просто обновите ваш itemTypes объект следующим образом:

var itemTypes = {
    bike:{
        maxLimit: 4,
        currentCount: 1,
        selector: '#currentbikes',
        newElement: '<div class="morebikesadd"><input type="text" name="currentbike[]" class="currentbikesadd" placeholder="Current Bikes" ><button class="delete">Delete</button></div>'
    },
    raceHistory:{
        maxLimit: 5,
        currentCount: 1,
        selector: '#racinghistoryresults',
        newElement: '<div style=" margin-top: 10px; margin-bottom: 10px;"><input type="text" name="racehist[]" class="racehist addmoreracehistory" placeholder="Race History">&nbsp;<input type="text" name="results[]" class="results addmorementionableresults" placeholder="Mentionable Results">&nbsp;<button class="delete">Delete</button></div>'
    },
    motorBike:{
        maxLimit: 10,
        currentCount: 1,
        selector: '#selectorformotorbike',
        newElement: '<div>Put your desired code for new element</div>'
    }
}

Вам не нужно ничего делать в вашем javascript для новых изменений!

Вот рабочий код:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

<button type="button" onclick="addMoreRows('raceHistory')"> Add More Race History</button>

<div id="racinghistoryresults">
</div>

<script>
var itemTypes = {
    bike:{
        maxLimit: 4,
        currentCount: 1,
        selector: '#currentbikes',
        newElement: '<div class="morebikesadd"><input type="text" name="currentbike[]" class="currentbikesadd" placeholder="Current Bikes" ><button class="delete" onclick="deleteRow(this, \'bike\')">Delete</button></div>'
    },
    raceHistory:{
        maxLimit: 5,
        currentCount: 1,
        selector: '#racinghistoryresults',
        newElement: '<div style=" margin-top: 10px; margin-bottom: 10px;"><input type="text" name="racehist[]" class="racehist addmoreracehistory" placeholder="Race History">&nbsp;<input type="text" name="results[]" class="results addmorementionableresults" placeholder="Mentionable Results">&nbsp;<button class="delete" onclick="deleteRow(this, \'raceHistory\')">Delete</button></div>'
    }
}

function addMoreRows(type){
    var item = itemTypes[type];
    if (item.currentCount < item.maxLimit) {
        item.currentCount++;
        $(item.selector).append(item.newElement);
    }
    else {
        alert('You Have Reached the limits')
    }
}

function deleteRow(event, type){
  $(event).parent('div').remove();
  itemTypes[type].currentCount--;
};
</script>

Надеюсь, это вам поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...