【问题标题】:Play framework: passing multiple implicit parameters through templates播放框架:通过模板传递多个隐式参数
【发布时间】:2012-08-30 18:44:52
【问题描述】:

我使用的是 Play 2.0.2,但在一个特定的视图模板设置中存在隐式参数问题。我会尽我所能描述它,但它并不完全是微不足道的,所以对于任何混淆,我提前道歉。

这个问题的核心是一个我称之为“片断”的模板。 piece 采用以下参数:

@(piecesData: objects.PiecesDataRequest)(implicit content: Html)

内容参数是隐式的,因为我从另一个模板以及控制器调用此模板。我找不到将“空”Html 从控制器显式传递给片段模板的方法,但是如果我隐式传递内容参数,它就可以工作。使用片段的模板是“pieceUploadModal”,它采用以下参数:

@(piecesData: objects.PiecesDataRequest, 
  pieceData: objects.PieceDataRequest, dialogTitle: String)

并像这样调用片段:

@pieces(piecesData){ [Html] }

现在我想添加第二个隐式参数来改变它的参数列表:

@(piecesData: objects.PiecesDataRequest)(implicit content: Html, user: User)

然后我假设我也需要更改 pieceUploadModal 模板参数:

@(piecesData: objects.PiecesDataRequest, 
  pieceData: objects.PieceDataRequest, dialogTitle: String)(implicit user: User)

一切顺利……但是,我收到了一个不太有用的错误:

pieceUploadModal.template.scala:24: not enough arguments for method apply: 
(implicit      content: play.api.templates.Html, 
implicit user: models.User)play.api.templates.Html in object pieces.
[error] Unspecified value parameter user.
[error] """),_display_(Seq[Any]
(/*3.2*/views/*3.7*/.html.content.pieces(piecesData)/*3.39*/
{_display_(Seq[Any] (format.raw/*3.40*/("""

几个小时以来,我一直试图让它以多种不同的方式工作,并进行了多次互联网搜索,但均无济于事。任何帮助将不胜感激。

作为最后一条信息,我将补充一点,我在这里使用的传递用户的范例隐式地适用于我所有其他 使用隐式 Html 参数的模板,即我相信这是问题的症结所在。

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

    我找不到将“空”Html 从控制器显式传递给片段模板的方法

    空的Html可以用Html("")传递,你甚至可以定义为默认值。

    但最后你只需要听编译器的声音——它永远不会说谎。从您的 cmets 我了解到这是您定义模板的方式:

    (piecesData: controllers.objects.PiecesDataRequest)(content: play.api.templates.Html)(implicit user: models.User)

    这就是你的称呼:

    views.html.content.pieces(PiecesDataRequest( Piece.getPiecesForContentFeed(contentFeedID), contentFeedID), Html(""))

    你定义了三个括号,但你只调用了两个。这样做:

    Ok(
       views.html.content.pieces(
           PiecesDataRequest(Piece.getPiecesForContentFeed(contentFeedID), contentFeedID))(Html(""))
       )
    )
    

    【讨论】:

    • 实际上,我尝试了这两种传递空 Html 的方法 - 尝试一下,它对我不起作用。其次,您关于混合显式和隐式的解释是有道理的......我确实尝试交换 html 和用户参数 - 没有奏效。让它显式有点违背了目的 - 避免使用碎片将用户通过每个控制器调用传递给视图。
    • 究竟什么不起作用,错误是什么?我一直在模板中使用空 Html。
    • 如果我像这样设置内容参数 @(...)(content: Html = Html("")) 并从我的控制器调用,我会收到此错误: Pieces.scala:48:缺少适用于对象块的方法的参数; [错误] 如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法 [错误] Ok(views.html.content.pieces( PiecesDataRequest( Piece.getPiecesForContentFeed(contentFeedID), contentFeedID))) 我试过了建议部分应用该功能,但无论如何我都会得到不同的错误。
    • 如果我尝试从控制器传递 Html 参数,如下所示: Ok(views.html.content.pieces( PiecesDataRequest( Piece.getPiecesForContentFeed(contentFeedID), contentFeedID), Html("") )) 然后我得到这个错误: Pieces.scala:48: too many arguments for method apply: (piecesData: controllers.objects.PiecesDataRequest)(content: play.api.templates.Html)(implicit user: models.User)play对象片段中的 .api.templates.Html [错误] Ok(views.html.content.pieces( PiecesDataRequest( Piece.getPiecesForContentFeed(contentFeedID), contentFeedID), Html("")))
    • 两种解决方案的许多排列...我最终会遇到相同或不同的编译错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2012-06-24
    • 1970-01-01
    • 2014-07-23
    • 2016-05-22
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多