玩! 1.2.5.:对象的枚举集合绑定到模板
Posted
技术标签:
【中文标题】玩! 1.2.5.:对象的枚举集合绑定到模板【英文标题】:Play! 1.2.5.: Object's collection of enums binding to template 【发布时间】:2012-07-15 19:25:46 【问题描述】:我正在 Play 中构建一个 Web 应用程序! 1.2.5。我有一个模型类,其中一个属性是枚举的 Set 集合:
@Entity
@Table(name="AppUser")
public class User extends Model
...
@Column(name = "industry_id")
@ElementCollection(targetClass = Industry.class)
@CollectionTable(name = "Industry", joinColumns = @JoinColumn(name = "AppUser_id"))
public Set<Industry> industries = new HashSet<Industry>();
枚举是:
public enum Industry
Industry1,
Industry2
如何将industries
集合绑定到一个编辑模板,其中industries
字段表示为复选框列表,并且选中或取消选中它们会在对象集合中添加或删除它们?
谢谢你
【问题讨论】:
【参考方案1】:你可以像这样绑定你的复选框
#form @save()
<input type="checkbox" value="Industry1" name="user.industries">Industry number 1
<input type="checkbox" value="Industry2" name="user.industries">Industry number 2
<input type="checkbox" value="Industry3" name="user.industries">Industry number 3
<input type="submit" value="Submit">
#/form
在我的情况下,它适用于没有 JPA 注释的模型,但我想它也适用于你的情况
【讨论】:
经过反复试验,这正是我最终想出的。谢谢你的回答!【参考方案2】:最近已经这样做了,我为您提供以下解决方案:
在控制器中,您将 Enum 作为 Iterator
传递给视图:
Iterator<Attribute> industries = EnumSet.allOf(Industry.class).iterator();
render(industries);
在您的表单视图中,您遍历列表并检查选择的内容:
#list items: industries, as: 'industry'
<label>
<input type="checkbox" name="industries" value="$industry.name()"
#if user?.industries?.contains(industry) checked #/if
/>
&'industry'
</label>
#/list
要处理未选择字段的情况,您需要以下内容(因为当未选择任何字段时,将不提交任何值,并且现有选择将保留:
<input type="hidden" name="industries" value="" />
最后,在接收表单输入的控制器方法中,有一个参数Set<Industry> industries
就足够了,Play 将在其中加载选定的值。
【讨论】:
非常感谢,但 Seb 的回答适用于我的场景。在我的例子中,控制器返回 renderTemplate(user) 和整个对象,而不仅仅是行业集合。 您要求为“以及他们的选中或取消选中添加它们或从对象集合中删除它们”的解决方案,这些用例由我的解决方案处理,但不使用 Sebs。在视图中复制 Enum 违反 DRY 并且是不好的做法,值得另外传入整个 EnumSet。 我同意 DRY 原则,但在我的情况下,自定义模板标签等不会重复任何内容。来自标签的示例: 我争论的是复制 Enum 值的代码,而不是输入标签的代码。以上是关于玩! 1.2.5.:对象的枚举集合绑定到模板的主要内容,如果未能解决你的问题,请参考以下文章
在 MVVM 中将 Observable 集合绑定到 wrappanel
ComboBox在WPF中的绑定示例:绑定项集合转换,及其源代码