如何避免在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>

我不知道它是好还是推荐,有没有更好的解决方案呢?


撒科打诨
浏览 432回答 3
3回答

喵喔喔

我这样做的方法是为我的导航/菜单创建一个新的控制器,并从视图中调用它所以你可以定义你的NavController:object&nbsp;NavController&nbsp;extends&nbsp;Controller&nbsp;{ &nbsp;&nbsp;private&nbsp;val&nbsp;navList&nbsp;=&nbsp;"Home"&nbsp;::&nbsp;"About"&nbsp;::&nbsp;"Contact"&nbsp;::&nbsp;Nil &nbsp;&nbsp;def&nbsp;nav&nbsp;=&nbsp;views.html.nav(navList)}nav.scala.html@(navLinks:&nbsp;Seq[String])@for(nav&nbsp;<-&nbsp;navLinks)&nbsp;{ &nbsp;&nbsp;<a&nbsp;href="#">@nav</a>}然后在我的主视图中我可以称之为NavController:@(title:&nbsp;String)(content:&nbsp;Html)<!DOCTYPE&nbsp;html><html> &nbsp;&nbsp;<head> &nbsp;&nbsp;&nbsp;&nbsp;<title>@title</title> &nbsp;&nbsp;</head> &nbsp;&nbsp;<body> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@NavController.nav &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@content &nbsp;&nbsp;</body></html>
打开App,查看更多内容
随时随地看视频慕课网APP