这就是我在HTML文件中的内容:
<ul>
<th:block th:object="${Post}">
<li class="post" th:each="Post : ${Posts}">
<p th:text ="${Post.getPostText()}"></p>
<button th:onclick = "${Post.upvote()}">Upvote</button>
<button th:onclick = "${Post.downvote()}">Downvote</button>
<p th:text = "${Post.getPostVotes()}"></p>
</li>
</th:block>
</ul>
我希望按钮在Post类中执行一个方法。我不确定我是否使用了正确的Thymeleaf'标签'。现在,当页面加载时,它会执行post upvote和downvote方法。 任何人都可以帮忙吗?我有一种感觉,我正在使用错误的Thymeleaf Tag。
答案 0 :(得分:1)
您需要发布帖子或获取请求来调用这些方法。这只适用于JSF,但您可以在de page呈现为html之前执行该方法。
例如这一行
'(foo)
将在呈现页面之前执行。
我在这里做的是为两个动作隐藏一个表单,两个带有名称属性的按钮,并传递某种标识符以了解巫婆实体我更新。 在我的控制器中有两个方法响应每个参数并返回一个视图或JSON。
答案 1 :(得分:-1)
因此他们认为我无法做我想做的事情,因为Thymeleaf会在页面加载之前生成HTML。它不会等待被触发的HTML中。我最终更改了HTML以转到该帖子所特有的其他网址。
<ul>
<th:block th:object="${Post}">
<li class="post" th:each="Post : ${Posts}">
<p th:text ="${Post.getPostText()}"></p>
<a th:href = "@{/post?id={id}&vote=1(id=${Post.getPostId()})}">Upvote</a>
<a th:href = "@{/post?id={id}&vote=0(id=${Post.getPostId()})}">Downvote</a>
<p th:text = "${Post.getPostVotes()}"></p>
</li>
</th:block>
</ul>
这是我的控制器中相应的java代码,它将更新对象:
@RequestMapping(value = "/post", params = {"id", "vote"})
public String PostVoting(@RequestParam("id") Long id, @RequestParam("vote") int vote)
{
if (currentUser.voteOnPost(id.toString())){
return "redirect:/home";
}
if(vote == 1){
int votes = thePostRepository.findById(id).get().getPostVotes() + 1;
thePostRepository.updateVotes(votes, id);
}
else{
int votes = thePostRepository.findById(id).get().getPostVotes() - 1;
thePostRepository.updateVotes(votes, id);
}
return "redirect:/home";
}
此外,如果您想更新我所做的事情,下一部分很重要:
@Transactional
@Modifying
@Query("UPDATE Post SET votes = :votes WHERE id = :id")
void updateVotes(@Param("votes") int votes, @Param("id") Long id);