如何将像HashMap这样的复合视图添加到playframework 2.4.x中的twirl



我想将包含许多不同对象的 HashMap 对象添加到 twirl 模板中,因为我不喜欢将一个接一个作为参数添加到 twirl,它打破了设计模式的规则。

正常样式:

views.html.index.render(object1, object2, list3, list4, ...);
@(object1:Object1Model, object2:Object2Model, list3: List[Object3Model], list4: List[Object4Model]) 

有没有解决方案可以设置和获取这样的参数?

Map data = new HashMap();
data.put("object1", object1);
data.put("object2", object2);
data.put("list3", list3);
data.put("list4", list4);
views.html.index.render(data);

如何在 twirl 中获取和定义 HashMap 中的对象,官方的 twirl 文档太简单了......

@(data:Map) 
Object1Model object1 = (Object1Model) data.get("object1");
Object2Model object2 = (Object2Model) data.get("object2");
List list3 = (List) data.get("list3");
List list4 = (List) data.get("list4");

非常感谢!

为了类型安全,您可以创建一个包含所需类型字段的专用类,额外的好处是复杂的 IDE 将识别字段类型和/或自动完成字段名称,因此它可以帮助您防止视图中的错误。

当然,与每个类一样,您也可以使用构造函数和/或getter/setter的优点。

(伪代码(:

package viewhelpers;
import java.util.ArrayList;
import java.util.List;
public class SomeViewHelper {
    public String header;
    public List<String> labels = new ArrayList<>();
    public List<Integer> values = new ArrayList<>();
}

以某种方式在控制器中填写它:

public static Result incomes() {
    SomeViewHelper data = new SomeViewHelper();
    data.header = "Incomes in first quarter";
    data.labels = Arrays.asList("Jan", "Feb", "Mar");
    data.values = Arrays.asList(121, 122, 123);
    return ok(views.html.incomes.render(data));
}

并在视图中使用,如下所示:

@(data: viewhelpers.SomeViewHelper)
<h1>@data.header</h1>
<table>
    <tr>
        @for(label <- data.labels) {
            <th>@label</th>
        }
    </tr>
    <tr>
        @for(value <- data.values) {
            <td>@value</td>
        }
    </tr>
</table>

最新更新