Play-Scala开发技巧 - 带索引遍历Form(arrayProperty)

    Play提供了Form、Field等表单类型,帮助开发者节省了很多表单处理方面的负担,但是有些功能目前不是很灵活,正如本文即将讨论的@helper.repeat函数,该函数目前无法让开发者直接访问元素索引,本文介绍两种方法,可以临时解决这个问题。

    假设我们的form定义如下:

case class User(_id: String, name: String, emails: List[String])
val userForm = Form[User](
    mapping(
      "_id" -> text,
      "name" -> nonEmptyText,
      "emails" -> list(nonEmptyText)
    )(User.apply)(User.unapply)
)

其中emails属性是List类型。

1. Field中如何存放List类型?

List类型在Field中是被打散存放的,所以无法直接从Field中取出该List实例,例如对于:

user.emails = List("a@smartnlp.cn", "b@smartnlp.cn", "c@smartnlp.cn")

直接调用userForm("emails").value返回None,正确的访问方式是:

userForm("emails")("[0]").value
userForm("emails")("[1]").value
userForm("emails")("[2]").value

或者

userForm("emails[0]").value
userForm("emails[1]").value
userForm("emails[2]").value

OK,背景知识介绍完毕,下面进入正题。

2. 使用Filed.indexes获取索引信息

    对于存放List属性的Field实例,其indexes属性将会返回其索引列表,类型为List[Int],代码如下:

@for(i <- userForm("emails").indexes){ 
    @userForm("emails")("[" + i + "]").value
}

3. 利用Field.name获取索引信息

@helper.repeat(userForm("emails"), min=0 ){ field =>
    @field.name
}

输出信息为:

emails[0]
emails[1]
emails[2]

4. 利用Form.value获取绑定的数据对象

@for((email, i) <- userForm.value.get.emails.zipWithIndex){
    @i - @email <br/>
}

第1种方法可以配合@import helper._下的工具函数使用;第2钟方式不够灵活,需要手工从字符串中解析出索引; 第3种方法虽然简单,但是无法配合@import helper._下工具函数使用。

欢迎光临我们的小站:

奇智智能客服机平台:http://www.smartnlp.cn

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏博客园

MSIL学习------从HelloWorld开始

  前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作...

1453
来自专栏java学习

面试题63(链表,哈希表)

关于链表,哈希表 1·以下关于链式存储结构的叙述中哪一个是正确的? A.链式存储结构不是顺序存取结构 B.逻辑上相邻的节点物理上必须邻接 C.可以通过计算直接确...

3136
来自专栏腾讯Bugly的专栏

内存泄露从入门到精通三部曲之基础知识篇

1 首先以一个内存泄露实例来开始本节基础概念的内容: 实例1:(单例导致内存对象无法释放而泄露) ? ? 可以看出ImageUtil这个工具类是一个单例,并引...

3386
来自专栏老九学堂

【超详细】Java入门学习进阶知识点汇总

入门阶段,主要是培养Java语言的编程思想。了解Java语言的语法,书写规范等,掌握Eclipse、MyEclipse等开发工具,编写Java代码的能力。学完这...

4145
来自专栏码神联盟

java常见异常汇总

程序猿的成长之路,从这开始.......... ? 在6月的投票中,结果昨天已经出来了,大家多数的希望多推送一些java的基础知识。首先来一下热...

4176
来自专栏xiaoxi666的专栏

状态机编程思想(1):括号内外字符串统计

我们拿到这个问题时,第一感觉往往是顺序遍历字符串,并检测左右相邻字符是否满足边界条件,从而进行分支处理。但是这样做有以下棘手之处:

1053
来自专栏Python爬虫与算法进阶

PEP8规则及Pycharm应用

PEP8 PEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书 PEP8 是什么呢,简单说就是一种编码...

4265
来自专栏数据科学

redis流计算

使用了tornado的异步和streamz的流处理两个库,需要redis 5.0以上版本

2305
来自专栏技术/开源

从C#到TypeScript - Promise

从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌...

2108
来自专栏向治洪

Android热补丁技术—dexposed原理简析(手机淘宝采用方案)

上篇文章《Android无线开发的几种常用技术》我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到da...

2796

扫码关注云+社区

领取腾讯云代金券