Wie Sie eine Liste der Objekte im Play Framework
Hier mein test-setup:
Modell:
package models;
import javax.persistence.Entity;
import play.db.jpa.Model;
@Entity
public class Item extends Model {
public String propertyA;
public String propertyB;
public String getFullName() {
return this.propertyA + " - " + this.propertyB;
}
}
Die Steuerung:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
List<Item> allItems = Item.findAll();
render(allItems);
}
public static void save(List<Item> items) {
if (items == null) {
Logger.info("no items");
} else {
for (Item item : items) {
Logger.info("item: %s",item);
}
Logger.info("-------");
}
index();
}
}
Der Ansicht:
#{extends 'main.html' /}
#{set title:'Home' /}
#{form @Application.save()}
Select Items:
<div>
<select name="items" style="width: 200px;" multiple="multiple" size="10">
#{list items:allItems, as: 'item'}
<option value=${item.id} >${item.fullName}</option>
#{/list}
</select>
</div>
<input type="submit" value="Save" />
#{/form}
Wenn ich wählen Sie zwei Elemente in der Select-box, ich bekomme folgende Log-Ausgabe:
06:22:20,560 INFO ~ -------
06:22:26,991 INFO ~ item: null
06:22:26,991 INFO ~ item: null
Sieht es aus wie spielen Karten, die Auswahl auf eine Liste von null
Objekte. Auch wenn ich die Ansicht ändern:
<option value=${item} >${item.fullName}</option>
Bekomme ich null
Werte.
Aber wenn ich den controller an:
public static void save(List<Long> items) {
...
}
Ich zumindest eine Liste der korrekten Ids.
Wie kann ich dies ändern, so dass spielen schafft die richtige Zuordnung für meine Artikel. Ich mir lieber List<Item>
statt List<Long>
(hier habe ich Abfragen ausführen um wieder die Liste der Artikel).
BR, Rene
Update:
Wenn ich laufen:
curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save
Wich nicht einen BEITRAG mit der oben genannten Parameter, den ich bekommen:
A02:39:53,072 INFO ~ item: bla - blo
02:39:53,072 INFO ~ item: null - null
02:39:53,072 INFO ~ -------
Wie das funktioniert, aber ich sehe nicht, wie könnte ich die Ansicht ändern, so dass es Beiträge, die die oben genannten Parameter 🙁
Update 2:
Mit der Hilfe von Felipe ich es geschafft habe. Dieser Controller-Methode Hinzugefügt werden:
@Before(only = {"save"})
static void parseParams() {
String[] items = params.getAll("items");
params.remove("items");
for (int i = 0; i < items.length; i++) {
Item item = Item.findById(Long.parseLong(items[i]));
params.put("items[" + i + "].id", items[i]);
params.put("items[" + i + "].propertyA", item.propertyA);
params.put("items[" + i + "].propertyB", item.propertyB);
}
}
- Es gibt einen Weg, es zu tun mit @interceptor Vor... ich update meine Antwort..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein verbindlicher problem, spielen ist nicht verbindlich, das lange [] - parameter, die es erhält.
Geht aus dem Spiel Dokumentation: http://www.playframework.org/documentation/1.2.3/controllers#objectbinding
Müssen Sie ändern Sie den Namen auf Ihrem wählen zu
items.id
Es ist möglich, dass es nicht funktionieren wird, da spielen erwartet der Liste zu haben den index als
items[i].id
...Sowieso, wenn dies nicht Ihr problem lösen, können Sie eine benutzerdefinierte Bindung, aber diese option ist gut, vor allem, wenn Sie gehen müssen, diese Bindung in einer Menge von Orten, wenn Sie es tun, nur einmal, es gibt keinen Grund, nicht die Abfrage, wie Sie sagte, in das Ende der post. (Wird diese Abfrage zu tun, diese Bindung, so dass Sie nicht verlieren oder gewinnen keine performance, indem es selbst tun)
Update
Etwas entlang der Linien:
Funktionieren sollte.
Andere Möglichkeit ist javascript, aber es ist schwieriger und Fehler anfällig.