列表输入中的 Thymeleaf 列表
Thymeleaf list within list input
我有这样的数据结构:-
WorkHistory{
List<Jobs> jobs;
}
Jobs{
List<String> workDoneSentences;
}
基本上,我试图收集一个人过去工作过的所有工作以及他在那里完成的工作。所以它是一个列表结构的列表。我想知道我们如何在 UI for Thymeleaf/Spring mvc.
中处理这个问题
我正在尝试创建 UI,如图所示。有一个table输入数据。要输入 workDoneSentence,我想打开另一个模式。并且语句列表应该与正确的作业索引绑定。
Work Done 打开模式以输入已完成的句子列表。
我的 html 代码如下:-
<tbody>
<tr id='addr_work0' th:each="workRow, rowStat : *{workHistoryDetails.allWorkHistoryData}">
<td th:text="${rowStat.index + 1}"></td>
<td><input type="text" name='work_name0'
placeholder='Company Name' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].companyName}"/></td>
<td><input type="text" name='work_city0'
placeholder='Company city' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].city}"/></td>
<td><input type="text" name='work_title0'
placeholder='Job Title' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].jobTitle}"/></td>
<td><input name="is_current0" type="checkbox"
value="" class="form-control" style="text-align: center;" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].currentJob}">
</td>
<td><input type="text" name='work_start0'
placeholder='Start Date' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].startDate}"/></td>
<td><input type="text" name='work_end0'
placeholder='End Date' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].endDate}"/></td>
<td><a class="btn btn-primary btn-md" id="work_done0"
name="work_done0">Work done</a></td>
</tr>
<tr id='addr_work1'></tr>
</tbody>
我不确定如何 link workDone 输入。请建议。
谢谢!
<td><a class="btn btn-primary btn-md" id="work_done0" name="work_done0" th:href="Modal">Work done</a></td>
Modal部分请自行配置
我试过如下,效果正常。
模板: 为每个作业创建唯一的 "modal"。 (work-list.html)
<form method="post" action="#" th:action="@{/work-list}" th:object="${workHistoryDetails}">
<table>
<thead>
<tr>
<th>
<button type="submit" name="addRow" th:text="'Add Row'">Add row</button>
</th>
</tr>
</thead>
<tbody>
<tr id='addr_work0' th:each="workRow, rowStat : *{jobs}">
<td th:text="${rowStat.index + 1}"></td>
<td><input type="text"
placeholder='Company Name' class="form-control" th:field="*{jobs[__${rowStat.index}__].companyName}"/></td>
<td><input type="text"
placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].city}"/></td>
<td><button type="button" class="btn btn-primary" data-toggle="modal" th:attr="data-target='#myModal'+${rowStat.index}" >Open modal</button></td>
<!-- The Modal -->
<div class="modal fade" th:id="'myModal'+${rowStat.index}">
<div class="modal-dialog">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h4 class="modal-title">Modal Heading</h4>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<!-- Modal body -->
<div class="modal-body">
<input type="text"
placeholder='Company Name' class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[0]}"/>
<input type="text"
placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[1]}"/>
</div>
<!-- Modal footer -->
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</tr>
</tbody>
</table>
<input type="submit" name="submit" value="Add" class="btn btn-danger" />
</form>
控制器:
@ModelAttribute("workHistoryDetails")
public WorkHistory populateWorkHistories() {
return this.workHistory.getAllHistoryDetail();
}
@Autowired
WorkHistoryService workHistory;
@GetMapping("/work-list")
public String greeting(final WorkHistory workHistoryDetails) {
return "work-list";
}
@RequestMapping(value="/work-list",method=RequestMethod.POST)
public String create(final WorkHistory workHistoryDetails) {
this.workHistory.setJobs(workHistoryDetails);
return "work-list";
}
// for adding new row job to jobs list
@RequestMapping(value="/work-list", params={"addRow"})
public String addRow(final WorkHistory workHistoryDetails, Model model) {
Jobs jobRow = new Jobs("","",new ArrayList<>());
workHistoryDetails.getJobs().add(jobRow);
model.addAttribute("workHistoryDetails", workHistoryDetails);
return "work-list";
}
服务: 仅供测试:
@Service
public class WorkHistoryService {
static WorkHistory workHistoryDetails =new WorkHistory();
static{
List<String> workDones = new ArrayList<>();
workDones.add("angular");
workDones.add("description");
List<String> workDones1 = new ArrayList<>();
workDones1.add("java,c++");
workDones1.add("description also");
Jobs job1 = new Jobs("Twitter", "USA",workDones);
Jobs job2 = new Jobs("Microsoft", "USA",workDones1);
List<Jobs> jobList = new ArrayList<>();
jobList.add(job1);
jobList.add(job2);
workHistoryDetails.setJobs(jobList);
}
public WorkHistory getAllHistoryDetail(){
return workHistoryDetails;
}
public void setJobs(WorkHistory workHistory){
workHistoryDetails.getJobs().clear();
List<Jobs> jobs = workHistory.getJobs();
for (Jobs job : jobs) {
workHistoryDetails.getJobs().add(job);
}
}
}
职位域:
public class Jobs {
private String companyName;
private String city;
private List<String> workDoneSentences;
//default constructor important!
public Jobs() {
super();
}
//setter getter
}
希望对你有所帮助
我有这样的数据结构:-
WorkHistory{
List<Jobs> jobs;
}
Jobs{
List<String> workDoneSentences;
}
基本上,我试图收集一个人过去工作过的所有工作以及他在那里完成的工作。所以它是一个列表结构的列表。我想知道我们如何在 UI for Thymeleaf/Spring mvc.
中处理这个问题我正在尝试创建 UI,如图所示。有一个table输入数据。要输入 workDoneSentence,我想打开另一个模式。并且语句列表应该与正确的作业索引绑定。
Work Done 打开模式以输入已完成的句子列表。
我的 html 代码如下:-
<tbody>
<tr id='addr_work0' th:each="workRow, rowStat : *{workHistoryDetails.allWorkHistoryData}">
<td th:text="${rowStat.index + 1}"></td>
<td><input type="text" name='work_name0'
placeholder='Company Name' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].companyName}"/></td>
<td><input type="text" name='work_city0'
placeholder='Company city' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].city}"/></td>
<td><input type="text" name='work_title0'
placeholder='Job Title' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].jobTitle}"/></td>
<td><input name="is_current0" type="checkbox"
value="" class="form-control" style="text-align: center;" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].currentJob}">
</td>
<td><input type="text" name='work_start0'
placeholder='Start Date' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].startDate}"/></td>
<td><input type="text" name='work_end0'
placeholder='End Date' class="form-control" th:field="*{workHistoryDetails.allWorkHistoryData[__${rowStat.index}__].endDate}"/></td>
<td><a class="btn btn-primary btn-md" id="work_done0"
name="work_done0">Work done</a></td>
</tr>
<tr id='addr_work1'></tr>
</tbody>
我不确定如何 link workDone 输入。请建议。 谢谢!
<td><a class="btn btn-primary btn-md" id="work_done0" name="work_done0" th:href="Modal">Work done</a></td>
Modal部分请自行配置
我试过如下,效果正常。
模板: 为每个作业创建唯一的 "modal"。 (work-list.html)
<form method="post" action="#" th:action="@{/work-list}" th:object="${workHistoryDetails}">
<table>
<thead>
<tr>
<th>
<button type="submit" name="addRow" th:text="'Add Row'">Add row</button>
</th>
</tr>
</thead>
<tbody>
<tr id='addr_work0' th:each="workRow, rowStat : *{jobs}">
<td th:text="${rowStat.index + 1}"></td>
<td><input type="text"
placeholder='Company Name' class="form-control" th:field="*{jobs[__${rowStat.index}__].companyName}"/></td>
<td><input type="text"
placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].city}"/></td>
<td><button type="button" class="btn btn-primary" data-toggle="modal" th:attr="data-target='#myModal'+${rowStat.index}" >Open modal</button></td>
<!-- The Modal -->
<div class="modal fade" th:id="'myModal'+${rowStat.index}">
<div class="modal-dialog">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h4 class="modal-title">Modal Heading</h4>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<!-- Modal body -->
<div class="modal-body">
<input type="text"
placeholder='Company Name' class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[0]}"/>
<input type="text"
placeholder='Company city' class="form-control" th:field="*{jobs[__${rowStat.index}__].workDoneSentences[1]}"/>
</div>
<!-- Modal footer -->
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</tr>
</tbody>
</table>
<input type="submit" name="submit" value="Add" class="btn btn-danger" />
</form>
控制器:
@ModelAttribute("workHistoryDetails")
public WorkHistory populateWorkHistories() {
return this.workHistory.getAllHistoryDetail();
}
@Autowired
WorkHistoryService workHistory;
@GetMapping("/work-list")
public String greeting(final WorkHistory workHistoryDetails) {
return "work-list";
}
@RequestMapping(value="/work-list",method=RequestMethod.POST)
public String create(final WorkHistory workHistoryDetails) {
this.workHistory.setJobs(workHistoryDetails);
return "work-list";
}
// for adding new row job to jobs list
@RequestMapping(value="/work-list", params={"addRow"})
public String addRow(final WorkHistory workHistoryDetails, Model model) {
Jobs jobRow = new Jobs("","",new ArrayList<>());
workHistoryDetails.getJobs().add(jobRow);
model.addAttribute("workHistoryDetails", workHistoryDetails);
return "work-list";
}
服务: 仅供测试:
@Service
public class WorkHistoryService {
static WorkHistory workHistoryDetails =new WorkHistory();
static{
List<String> workDones = new ArrayList<>();
workDones.add("angular");
workDones.add("description");
List<String> workDones1 = new ArrayList<>();
workDones1.add("java,c++");
workDones1.add("description also");
Jobs job1 = new Jobs("Twitter", "USA",workDones);
Jobs job2 = new Jobs("Microsoft", "USA",workDones1);
List<Jobs> jobList = new ArrayList<>();
jobList.add(job1);
jobList.add(job2);
workHistoryDetails.setJobs(jobList);
}
public WorkHistory getAllHistoryDetail(){
return workHistoryDetails;
}
public void setJobs(WorkHistory workHistory){
workHistoryDetails.getJobs().clear();
List<Jobs> jobs = workHistory.getJobs();
for (Jobs job : jobs) {
workHistoryDetails.getJobs().add(job);
}
}
}
职位域:
public class Jobs {
private String companyName;
private String city;
private List<String> workDoneSentences;
//default constructor important!
public Jobs() {
super();
}
//setter getter
}
希望对你有所帮助