правильный способ предложить имена пользователю в форме с функцией javascript - PullRequest
1 голос
/ 29 мая 2020

Доброе утро,

Я разрабатываю приложение, в котором имена объектов «Пакет» имеют предопределенную структуру:

progressiveLetter + number + ' ' (space) + year

Например, A01 2020 и B03 2020. Число зависит от значения, выбранного в поле выбора:

<form:select class="form-control" id="numero_settore_act" path="numero_settore_act.id_settori"  onchange="buildNameAct.apply(this, ${nextLettersAct})">
   <form:option value="" />
   <form:options items="${settoriAct}" itemValue="id_settori" itemLabel="numero_settore" />
</form:select>

При изменении Javascript функции buildNameAct (код в конце вопроса) поместите в текстовое поле созданное имя. Еще в целом:

  • год правильно взят из другого поля
  • номер взят правильно из поля выбора
  • Теперь пора установить букву, вот и боль.

Буквы поступают в массив объектов String из серверной части (Spring MVC), поэтому они находятся в ModelMap.

Поиск net I обнаружил, что способ передать массив в функцию javascript - это использовать метод .apply(), как я сделал с buildNameAct.apply(this, ${nextLettersAct}). Проблема в том, что он вообще не работает, единственная информация, указанная в консоли, - это исключение:

Uncaught SyntaxError: Unexpected token ';'

хотя я не знаю почему.

Есть ли способ лучше передать массив, который я создаю в бэкэнд, чем это? или где ошибка в моем коде? Я пробовал несколько часов, но ничего не решил.

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

Js код функции

function buildNameAct(a, b, c, d, e, f, g, h)
{
    let sectorValue = document.getElementById("numero_settore_act").value;
    let sectorNumber = +sectorValue;
    let letterValue = '';
    switch (sectorNumber)
    {
        case 1:
            letterValue = a;
            break;
        case 2:
            letterValue = b;
            break;
        case 3:
            letterValue = c;
            break;
        case 4:
            letterValue = d;
            break;
        case 5:
            letterValue = e;
            break;
        case 6:
            letterValue = f;
            break;
        case 7:
            letterValue = g;
            break;
        case 8:
            letterValue = h;
            break;
    }
    if(sectorNumber < 10)
    {
        sectorValue = '0'.concat(sectorValue);
    }
    let yearValue = document.getElementById("anno_lotto").value;

    document.getElementById("nome_batch_act").value = letterValue.concat(sectorValue).concat(" ").concat(yearValue);
}

EDIT

Дальнейшие исследования показывают, что строка

<form:select class="form-control" id="numero_settore_act" path="numero_settore_act.id_settori" onchange="buildNameAct.apply(this, ${nextLettersAct})">

переводится как

onchange="buildNameAct.apply(this, [Ljava.lang.Object;@3528ec13)"

, и это может привести к вышеупомянутой ошибке Unexpected token ';', теперь я не знаю, как передать массив таким образом, чтобы он переведен без ;, вызывающего ошибку.

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