为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在play2中到处传递参数?

如何避免在play2中到处传递参数?

如何避免在play2中到处传递参数?在play1中,我通常会在操作中获取所有数据,直接在视图中使用它们。由于我们不需要在视图中显式声明参数,因此这非常简单。但是在play2中,我发现我们必须request在视图的头部声明所有参数(包括),在动作中获取所有数据并将它们传递到视图中会非常无聊。例如,如果我需要显示从首页的数据库加载的菜单,我必须在以下位置定义main.scala.html:@(title: String, menus: Seq[Menu])(content: Html)    <html><head><title>@title</title></head><body>     <div>     @for(menu<-menus) {        <a href="#">@menu.name</a>     }     </div>     @content</body></html>然后我必须在每个子页面中声明它:@(menus: Seq[Menu])@main("SubPage", menus) {    ...}然后我必须得到菜单并传递给每个动作查看:def index = Action {    val menus = Menu.findAll()    Ok(views.html.index(menus))}def index2 = Action {    val menus = Menu.findAll()    Ok(views.html.index2(menus))}def index3 = Action {    val menus = Menu.findAll()    Ok(views.html.index(menus3))}现在它只有一个参数main.scala.html,如果有很多,怎么办?所以最后,我决定Menu.findAll()直接看到所有人:@(title: String)(content: Html)    <html><head><title>@title</title></head><body>     <div>     @for(menu<-Menu.findAll()) {        <a href="#">@menu.name</a>     }     </div>     @content</body></html>我不知道它是好还是推荐,有没有更好的解决方案呢?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

我这样做的方法是为我的导航/菜单创建一个新的控制器,并从视图中调用它

所以你可以定义你的NavController

object NavController extends Controller {
  private val navList = "Home" :: "About" :: "Contact" :: Nil
  def nav = views.html.nav(navList)}

nav.scala.html

@(navLinks: Seq[String])@for(nav <- navLinks) {
  <a href="#">@nav</a>}

然后在我的主视图中我可以称之为NavController

@(title: String)(content: Html)<!DOCTYPE html><html>
  <head>
    <title>@title</title>
  </head>
  <body>
     @NavController.nav
     @content
  </body></html>


查看完整回答
反对 回复 2019-08-23
  • 3 回答
  • 0 关注
  • 429 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信