元组在PlayFramework中的作用
The role of Tuple in PlayFramework
我现在用的是play2.2.1,会Java,但不会Scala。
如果你稍微学习一下PlayFramework,你就会知道该框架在某种程度上使用了Scala。这只是我的背景。问题是为什么在下面的代码中使用 Tuple2 虽然传递值的数量是一个而不是复数。
这是控制器的代码:
//Action for making a message
public static Result add() {
Form<Message> f = new Form(Message.class);
List<Member> mems = Member.find.select("name").findList();
List<Tuple2<String, String>> opts =
new ArrayList<Tuple2<String, String>>();
for(Member mem: mems) {
opts.add(new Tuple2(mem.name, mem.name));
}
return ok(add.render("fill-in form", f, opts));
}
这是模特的代码:
@Entity
public class Member extends Model {
@OneToMany(cascade = CascadeType.ALL)
public List<Message> messages = new ArrayList<Message>();
@Id
public Long id;
@Required(message = "This item is Required")
public String name;
@Email(message = "Please Fill in a message")
public String mail;
public String tel;
public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class);
@Override
public String toString() {
String ids = "{id:";
for (Message m: messages) {
ids += " " + m.id;
}
ids += "}";
return ("[id:" + id + ", message:" + ids + ", name:" + name + ", mail:" + mail + ", tel:" + tel + "]");
}
public static Member findByName(String input) {
return Member.find.where().eq("name", input).findList().get(0);
}
}
这是视图的代码:
@(msg:String, form1: Form[models.Message], opts: List[Tuple2[String, String]])
@main("Sample page") {
<h1>ADD MESSAGE</h1>
<p>@msg</p>
@helper.form(action = routes.Application.create) {
@(helper.select (
field = form1("name"),
options = opts
))
@(helper.textarea (
field = form1("message")
))
<input type="submit">
}
}
同样,为什么包含两个字符串值的 Tuple2 被使用,尽管一个值从控制器传递到视图?
如果我这里显示的信息还不够,请给我评论。
元组的作用是在单个实例中提供多个值。或许有点像无名的class?总结一下评论,举个清楚的例子,<option>
标签在<select>
结构中的结构是
<option value="internal-value">shown-value</option>
我们经常在外键情况下使用它 - 外键值在 "internal-value" 中,链接 table 中的名称或其他属性在显示值中。
如果您使用播放助手@select 来生成它,您应该提供一个 Seq
的 tuple2s - 即每个选项两个字符串。第一个用于内部值,第二个用于显示值。我使用 defining
但这只是一种方法。例如:
@defining(for (a <- AppType.all()) yield (a.id.toString,a.name)) { appTypeList =>
@select(
apiForm("forApp"),
appTypeList,
'class -> "form-control",
'_default -> "-- None Selected --",
'_label -> "App Type"
)
}
如果您有一些特殊需要或有理由不使用该帮助程序,您可以自己手动生成它(或者您可以编写自己的帮助程序:))。例如:
<select name="forApiType" id="forApiType">
@ApiType.all().map { a =>
<option value="@a.id" @if(a.id==apiType.id) {selected}>
@a.name
</option>
}
</select>
我现在用的是play2.2.1,会Java,但不会Scala。 如果你稍微学习一下PlayFramework,你就会知道该框架在某种程度上使用了Scala。这只是我的背景。问题是为什么在下面的代码中使用 Tuple2 虽然传递值的数量是一个而不是复数。
这是控制器的代码:
//Action for making a message
public static Result add() {
Form<Message> f = new Form(Message.class);
List<Member> mems = Member.find.select("name").findList();
List<Tuple2<String, String>> opts =
new ArrayList<Tuple2<String, String>>();
for(Member mem: mems) {
opts.add(new Tuple2(mem.name, mem.name));
}
return ok(add.render("fill-in form", f, opts));
}
这是模特的代码:
@Entity
public class Member extends Model {
@OneToMany(cascade = CascadeType.ALL)
public List<Message> messages = new ArrayList<Message>();
@Id
public Long id;
@Required(message = "This item is Required")
public String name;
@Email(message = "Please Fill in a message")
public String mail;
public String tel;
public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class);
@Override
public String toString() {
String ids = "{id:";
for (Message m: messages) {
ids += " " + m.id;
}
ids += "}";
return ("[id:" + id + ", message:" + ids + ", name:" + name + ", mail:" + mail + ", tel:" + tel + "]");
}
public static Member findByName(String input) {
return Member.find.where().eq("name", input).findList().get(0);
}
}
这是视图的代码:
@(msg:String, form1: Form[models.Message], opts: List[Tuple2[String, String]])
@main("Sample page") {
<h1>ADD MESSAGE</h1>
<p>@msg</p>
@helper.form(action = routes.Application.create) {
@(helper.select (
field = form1("name"),
options = opts
))
@(helper.textarea (
field = form1("message")
))
<input type="submit">
}
}
同样,为什么包含两个字符串值的 Tuple2 被使用,尽管一个值从控制器传递到视图? 如果我这里显示的信息还不够,请给我评论。
元组的作用是在单个实例中提供多个值。或许有点像无名的class?总结一下评论,举个清楚的例子,<option>
标签在<select>
结构中的结构是
<option value="internal-value">shown-value</option>
我们经常在外键情况下使用它 - 外键值在 "internal-value" 中,链接 table 中的名称或其他属性在显示值中。
如果您使用播放助手@select 来生成它,您应该提供一个 Seq
的 tuple2s - 即每个选项两个字符串。第一个用于内部值,第二个用于显示值。我使用 defining
但这只是一种方法。例如:
@defining(for (a <- AppType.all()) yield (a.id.toString,a.name)) { appTypeList =>
@select(
apiForm("forApp"),
appTypeList,
'class -> "form-control",
'_default -> "-- None Selected --",
'_label -> "App Type"
)
}
如果您有一些特殊需要或有理由不使用该帮助程序,您可以自己手动生成它(或者您可以编写自己的帮助程序:))。例如:
<select name="forApiType" id="forApiType">
@ApiType.all().map { a =>
<option value="@a.id" @if(a.id==apiType.id) {selected}>
@a.name
</option>
}
</select>