Golang中复选框选中的惯用方法

4
在你点踩之前,请注意,这个问题并不像标题听起来那么荒谬。
假设我有物品和类别。一个物品可以属于多个类别。
我有一个基本的HTML表单,用户填写信息以创建一个项目。我还将所有类别列为复选框列表(请参见下面的代码),以便用户可以勾选创建的项目应属于哪个类别(一个或多个)。
到目前为止一切都很好。
然而,当用户编辑此项目时,我当然希望显示类别复选框列表,并将该项目所属的类别作为选中状态显示出来,以便您可以轻松地查看该项目当前属于哪些类别,并进行取消选择等操作。
听起来很容易。
因此,在控制器中我们会有以下查询(假设我想编辑id = 3的项目)。
1) SELECT * FROM Item WHERE Id = 3  (gets us the item we want to edit)
2) SELECT * FROM Categories WHERE 1 (gets ALL categories)
3) SELECT CategoryId FROM ItemCategories WHERE ItemId = 3 (gets the categoryids for the categories the item belongs to)

展示所有类别的HTML代码如下:

显示类别(所有类别)的HTML代码如下:

<form>
...
{{range .Categories}}
<input name="cat" type="checkbox" value="{{ .Id }}" /> {{ .Title}} <br />
{{end}}
...
</form>

因此,我通常希望能够针对范围内的每个类别,检查ItemCategories结果中是否存在Id,并在HTML代码中将其设置为checked。由于这很难使用FuncMap完成,因为它不允许您将已选类别的切片传递给该方法,因此在呈现层中如何完成此操作变得有些具有挑战性,尽管您具有所需的数据。

当然,我可以在控制器中以多种方式完成此操作(从将第二个和第三个查询结果合并为结构体,到在那里构建HTML输出,通过上下文将其传递到HTML页面),但由于我仍在学习如何在golang中编码,所以我想检查其他人是如何解决这种类型的情况的,因为它在本质上是相当通用的(即,我肯定会再次遇到它)。

谢谢。

1个回答

2

原来,funcmap函数可以接受两个参数,因此我们实际上可以将类别与物品类别之间的比较放在“视图”中,即在HTML中。唯一的技巧是避免范围内的“点”上下文问题。

因此,解决方案如下:

{{ $ic := .ItemCategories }}  //this is needed since range changes the context
{{range .Categories}}
    <input name="cat" type="checkbox" value="{{ .Id }}" {{ CategorySelected .Id $ic}}/> {{ .Title}} <br />
{{end}}

请注意,将id与ids切片进行比较的CategorySelected需要在FuncMap定义中列出才能正常工作(至少对我而言,没有这样做它就无法正常工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接