Доброе утро,
Я разрабатываю приложение, в котором имена объектов «Пакет» имеют предопределенную структуру:
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 ';'
, теперь я не знаю, как передать массив таким образом, чтобы он переведен без ;
, вызывающего ошибку.