【问题标题】:How to get a variable in Thymeleaf when a map is already involved?当已经涉及地图时,如何在 Thymeleaf 中获取变量?
【发布时间】:2020-12-30 23:19:08
【问题描述】:

在我的项目中,我有一个 SVG 图(我希望这是正确的词),我在其中显示来自哈希映射的数据。为了使这更加动态,我需要一个变量来进行计算。

在这种情况下,我需要帮助将 2020 年更改为我在 Java 后端设置的可变年份。但它是如何到达那里的呢?

<circle th:each="einnahmenUmsatz : ${plotDatenEinnahmen}" 
        th:cx="${100*einnahmenUmsatz.getKey().getMonthValue() + 1200*(einnahmenUmsatz.getKey().getYear()%2020)}" 
        th:cy="${375-20*einnahmenUmsatz.getValue().getNumber().intValue()/1000}" 
        th:data-value="${einnahmenUmsatz.getValue().getNumber().intValue()}" r="4">
    <title th:text="${einnahmenUmsatz.getValue()}"></title>
</circle>

【问题讨论】:

  • 为什么不能只使用另一个属性作为年份?如果 必须 是单个对象,一种选择是将 plotDatenEinnahmen 更改为可以使用 getEinnahmenUmsatzElements()getYear() 的对象。知道为什么将模运算符与年份一起使用会很有趣。
  • 计算当前年份的模数。如果 mod = 0 年份仍然与开始相同,1 = 2021 等等。这可能很复杂并且不是最好的方法,但它确实有效。是的,但我怎样才能得到我的计算的属性? (对不起,我是 thymeleaf 的新手,我的想法经常行不通)

标签: java html thymeleaf


【解决方案1】:

只需将另一个属性添加到 Model(使用 Spring 时)或添加另一个变量到 Context(使用普通 Thymeleaf 时):

model.addAttribute("year", 2020); // Spring Web/MVC
// or
context.addVariable("year", 2020); // plain Thymeleaf

然后在模板中使用(将%替换为-):

th:cx="${100*einnahmenUmsatz.getKey().getMonthValue() + 1200*(einnahmenUmsatz.getKey().getYear()-year)}"

使用 Spring 的完整工作示例(稍作修改):

@Controller
public class GraphicsController {

    @GetMapping("/graphics")
    public String getGraphics(Model model) {

        // generate test data
        final Map<YearAndMonth, Integer> data = new LinkedHashMap<>();
        for (int y = 0; y < 3; y++) {
            for (int m = 1; m <= 12; m++) {
                data.put(new YearAndMonth(2019+y, m), 6000 + (6*y + m) * 1000);
            }
        }

        model.addAttribute("data", data);
        model.addAttribute("year", 2020);
        return "graphics";
    }

    public static class YearAndMonth {
        private final int year;
        private final int month;

        public YearAndMonth(final int year, final int month) {
            this.month = month;
            this.year = year;
        }

        public int getYear() {
            return year;
        }

        public int getMonth() {
            return month;
        }
    }
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
  <meta charset="utf-8">
  <title>SVG with Thymeleaf</title>
</head>
<body>
<svg viewBox="-1200 -400 3800 800">
  <circle th:each="entry : ${data}"
          th:cx="${100*entry.getKey().getMonth() + 1200*(entry.getKey().getYear()-year)}"
          th:cy="${375-20*entry.getValue()/1000}"
          th:data-value="${entry.getValue()}"
          r="4">
    <title th:text="${entry.getValue()}"></title>
  </circle>
</svg>
</body>
</html>

【讨论】:

  • 非常感谢,确实解决了问题。我以为我必须在 th: each 处插入变量(我不知道为什么)。费利克斯
猜你喜欢
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2021-11-06
相关资源
最近更新 更多