在你击中downvote之前,问题并不像标题所说的那样荒谬。
说我有物品和类别。一个项目可以属于多个类别。
我有一个基本的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看起来像这样
<form>
...
{{range .Categories}}
<input name="cat" type="checkbox" value="{{ .Id }}" /> {{ .Title}} <br />
{{end}}
...
</form>
所以,我通常想要做的只是能够在范围内的每个类别检查ItemCategories结果中是否存在Id,如果是,则将其设置为在HTML代码中检查。由于很难为此使用FuncMap,因为它不允许您将带有已检查类别的切片传递给方法,因此在给定如何在表示层中完成此操作变得有点挑战你有你需要的数据。
当然,我可以在控制器中以多种方式执行此操作(将第二个和第三个查询中的两个结果合并为结构,在那里构建HTML输出,通过上下文将其传递到HTML页面)因为我还在学习如何在golang中编码,所以我只想检查其他人如何解决这种情况,因为它本质上是非常通用的(即我肯定会再遇到它)。
感谢。
答案 0 :(得分:1)
好吧,如果你愿意,可以删除这个问题但是我在这里做了什么。也许它可以帮助其他人遇到同样的问题。
事实证明,funcmap函数可以采用两个参数,因此我们实际上可以在&#34;视图&#34;中对项目的类别和类别进行比较。即在HTML中。唯一的诀窍是避免&#34; dot&#34;范围内的上下文问题。
所以,解决方案看起来如此:
{{ $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与一片id进行比较的CategorySelected需要在FuncMap定义中列出以便工作(至少它没有为我工作)。