Playframework 将参数传递给main.scala.html
问题(哪个有效): 我在应用程序中使用Play 2.1.x版本。我的应用程序有一个静态标题/工具栏,其中有登录/注销链接。我在main.scala.html模板中创建了状态头html代码,而不是在所有模板中重复状态头html代码。现在要更改登录/注销状态,我需要向main.scala.html传递一个参数。 如果我是对的,这是我们在游戏中使用的所有模板的父模板,因此如果我们在主模板中添加任何参数,它必须由子模板提供,例如索引、登录等(您可以命名) 到目前为止,我能够通过在一个特性中创建一个隐式def来实现这一点,并让controller实现这样的特性(混合合成…) 让我的所有其他控制器扩展ApplicationController,而不是仅播放控制器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
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");
}
});