Playframework 将参数传递给main.scala.html

Playframework 将参数传递给main.scala.html,playframework,playframework-2.0,scala-2.10,Playframework,Playframework 2.0,Scala 2.10,问题(哪个有效): 我在应用程序中使用Play 2.1.x版本。我的应用程序有一个静态标题/工具栏,其中有登录/注销链接。我在main.scala.html模板中创建了状态头html代码,而不是在所有模板中重复状态头html代码。现在要更改登录/注销状态,我需要向main.scala.html传递一个参数。 如果我是对的,这是我们在游戏中使用的所有模板的父模板,因此如果我们在主模板中添加任何参数,它必须由子模板提供,例如索引、登录等(您可以命名) 到目前为止,我能够通过在一个特性中创建一个隐式d

问题(哪个有效)

我在应用程序中使用Play 2.1.x版本。我的应用程序有一个静态标题/工具栏,其中有登录/注销链接。我在main.scala.html模板中创建了状态头html代码,而不是在所有模板中重复状态头html代码。现在要更改登录/注销状态,我需要向main.scala.html传递一个参数。 如果我是对的,这是我们在游戏中使用的所有模板的父模板,因此如果我们在主模板中添加任何参数,它必须由子模板提供,例如索引、登录等(您可以命名)

到目前为止,我能够通过在一个特性中创建一个隐式def来实现这一点,并让controller实现这样的特性(混合合成…)

让我的所有其他控制器扩展ApplicationController,而不是仅播放控制器

object LoginController extends ApplicationController{...}
现在我的模板参数如下所示

主模板

@(title: String)(content: Html)(implicit status : Boolean)
其他模板,如登录

@(message: String)(implicit status : Boolean)
这很好但我对解决方案不满意,因为它迫使我将这个额外的隐式参数传递给所有模板

我确实希望避免将此隐式参数传递给我的所有子模板

因为我觉得这是一个多余的代码,实际上不是一个好的编程实践。看来我没有把这个概念想清楚

此外,编译器还强制我将动作{隐式请求=>放在我正在创建的所有控制器上,否则它只会抛出编译错误

我检查了play bundle中提供的示例代码,它们很好,但我对流程的怀疑不清楚

提前谢谢

我确实希望避免将此隐式参数传递给我的所有子模板

答案是,这是不可能避免(可悲的)

(他是Typesafe的游戏框架开发人员)

我也使用这种模式,但我更喜欢将名称
ApplicationContext
用于传递给所有视图的case类

case class ApplicationContext(user: Option[User], moreData: SomeData)

trait ApplicationController extends Controller {
  implicit def context[A](implicit request: Request[A]): ApplicationContext = {
    // Find all necessary data needed
    ...
    ApplicationContext(user, data)
  }
}
然后我的视图通常采用以下参数(包括i18n使用的
Lang
):


为了避免这种情况,我建议不要让每个页面都使用main.scala.html

有几种方法可以做到这一点。一种是通过连接,因为您的视图实际上只是返回连接的字符串,由结果包装(Ok、BadRequest等)

不过这有点难看

第二种方法是在初始页面加载时发送尽可能少的数据,并使用AJAX请求逐步增强视图

//服务器端

def getStuff = Action { Ok(stuff.scala.html()) }

def getMoarStuff = Action { Ok(moarStuff.scala.html(someData)) }
//客户端

$.ajax({
  method  : "GET",
  url     : "http://localhost:9000/moar/stuff",
  success : function() {
    console.log("got stuff");
  },
  failure:function() {
    console.log("failed");
  }
});

这是a的前提和优势。您可以通过滚动自己的AJAX处理程序来实现这一点(参见上文愚蠢之处)或者使用JavaScript框架,如主干、余烬或Angular。每个框架都有自己的特点/优点/缺点,但需要了解的重要一点是,它们在游戏中都非常有用。

感谢您的回答。后来我意识到,在根上下文中,我需要更多的参数,并且确实做了一些事情类似于您所做的。看起来创建隐式变量可能对静态数据有效,但对动态数据无效。Jason-我同意您的方法,事实上,我现在使用Angular(从现有的淘汰中替换它).Play非常适合所有这些前端js api,因为它在后端和前端之间提供了一个纯粹的分离(纯web服务框架,可以从任何地方调用,不限于模板),我唯一想了解的是,如果存在具有适当层次结构的scala隐式机制,我如何才能很好地使用它。我喜欢您为每个模块使用单独的main的方法。非常感谢!
def getStuff = Action { Ok(header.scala.html(someData) + stuff.scala.html()) }
def getStuff = Action { Ok(stuff.scala.html()) }

def getMoarStuff = Action { Ok(moarStuff.scala.html(someData)) }
$.ajax({
  method  : "GET",
  url     : "http://localhost:9000/moar/stuff",
  success : function() {
    console.log("got stuff");
  },
  failure:function() {
    console.log("failed");
  }
});