Как передать параметр в onclick в Thymeleaf?

#thymeleaf

#thymeleaf

Вопрос:

Я передаю ArrayList, но onclick передает параметру строку в функции javascript. Как я могу получить массив вместо строки

 <div class="card" th:data-work="${top.section}" onclick="showData(this.dataset.work)">
  

В окне консоли его печатная строка, но я передал массив, я не знаю, как его преобразовать в строку.

 const activityModal  = (work) => {
        console.log(typeof work) // string  
        console.log(work) //[com.example.working.Foobar@7r6r8e]
        console.log(work[0]) // [

    }
  

Ответ №1:

Содержимое data-work атрибута в div представляет собой строковое представление того, что возвращается ${top.section} . Итак, в вашем случае это выглядит так:

 <div class="card" 
     data-work="[com.example.working.Foobar@7r6r8e]" 
     onclick="showData(this.dataset.work)">some content</div>
  

Это [com.example.working.Foobar@7r6r8e] результат вызова toString() метода для каждого из ваших Foobar объектов в ArrayList, когда Thymeleaf обрабатывает шаблон.

Поэтому, чтобы получить полезные данные в div, вам необходимо переопределить toString() метод в вашем Foobar классе.

Кроме того, вам необходимо переопределить его таким образом, чтобы обеспечить удобное представление данных в каждом Foobar экземпляре.

В моем крошечном тестовом примере у меня есть только одно поле в моем тестовом классе, поэтому я сделал это:

 @Override
public String toString() {
    return "{ "amount":"   amount   "}";
}
  

Я решил отформатировать данные в формате JSON, чтобы их было легче обрабатывать с помощью JavaScript.

Теперь div выглядит примерно так (в моем случае):

 <div class="card" 
     data-work="[{ amp;quot;amountamp;quot;:123}, { amp;quot;amountamp;quot;:456}]" 
     onclick="showData(this.dataset.work)">click me!</div>
  

В showData функции на моей странице у меня есть это:

 function showData(work) {
    console.log(JSON.parse(work))
}
  

Это показывает, что мои данные были проанализированы из строки обратно в массив JavaScript, содержащий два объекта JS (потому что я поместил 2 объекта в свой ArrayList):

введите описание изображения здесь

Будьте осторожны, как вы решите переопределить toString() — или если вы даже должны.

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

Они ( toString и ваш stringifier), вероятно, следует хранить в виде отдельных форматов, поскольку они служат совершенно разным целям.

(Также, если вы решите использовать JSON в качестве представления, которое вы передаете в Thymeleaf, используйте библиотеку для его создания — не ленитесь, как я в своей крошечной демонстрации: не используйте конкатенацию строк.)