【问题标题】:Play! 1.2.5.: Object's collection of enums binding to template玩! 1.2.5.:对象的枚举集合绑定到模板
【发布时间】: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 字段表示为复选框列表,并且选中或取消选中它们会在对象集合中添加或删除它们?

谢谢你

【问题讨论】:

    标签: java groovy playframework playframework-1.x


    【解决方案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&lt;Industry&gt; industries 就足够了,Play 将在其中加载选定的值。

    【讨论】:

    • 非常感谢,但 Seb 的回答适用于我的场景。在我的例子中,控制器返回 renderTemplate(user) 和整个对象,而不仅仅是行业集合。
    • 您要求为“以及他们的选中或取消选中添加它们或从对象集合中删除它们”的解决方案,这些用例由我的解决方案处理,但不使用 Sebs。在视图中复制 Enum 违反 DRY 并且是不好的做法,值得另外传入整个 EnumSet。
    • 我同意 DRY 原则,但在我的情况下,自定义模板标签等不会重复任何内容。来自标签的示例:
    • 我争论的是复制 Enum 值的代码,而不是输入标签的代码。
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2020-07-26
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多