在视图中使用控制器方法 - Play框架 - Scala

时间:2016-06-08 08:23:25

标签: html scala playframework

我必须在Web项目中使用Play Framework,我必须将视图与控制器类连接起来。意思是,我必须在视图(scala.html)中使用在控制器(scala)中声明的方法。 我真的不知道怎么做。 我尝试过像

这样的事情
     @controller.class.method()

但它没有用。 我已经查了一下,但一无所获,也许是因为它太简单了,任何人都会问它......?

我很感激帮助。

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式访问模板中的反向路线:

@routes.controllersFolder.MyControllerName.endPointName

这将解析路线。

例如路线档:

GET   /myApp/endpointExample  controllersFolder.MyControllerName.endPointName

所以

@routes.controllersFolder.MyControllerName.endPointName

将解决:

/myApp/endpointExample

如果您希望在客户端使用AJAX,我强烈推荐JSRoutes

如果您想拥有控制器的功能,那么您应该在模块中将其解耦,例如:

trait MyTrait {
  def add(x: Int, y: Int): Int = x + y
}

@Singleton 
class MyClass with MyTrait

@Singleton
class MyController @Inject() (myClass: MyClass) extends Controller {
  def endPointName(x: String, y: String): Action[AnyContent] = {
    try {
      Ok(
        Json.toJson(
          Json.obj(
            "result" -> myClass.add(
              x = x.toInt,
              y = y.toInt
            )
          )
        )
      )
    } catch {
      case e: NonFatal => BadRequest(
        Json.toJson(
          Json.obj(
            "error" -> e.getMessage
          )
       )
    }
  }
}

然后你可以参考MyClass的逻辑,而不必形成一个请求,解耦逻辑如下:

@Singleton
class MyOtherController @Inject() (myClass: MyClass) extends Controller {
  def myHtmlPage(): Action[AnyContent] = {
    views.html.myView(myClass)
  }
}

在HMTL中

myView.scala.html:

@(myClass: MyClass)

@myClass.add(1, 2) // = 3

我希望这有帮助, 里斯

答案 1 :(得分:1)

如果你想在视图中调用控制器,你应该在sys.path.insert(1, '<yourFolder>/google_appengine') sys.path.insert(1, '<yourFolder>/google_appengine/lib/yaml/lib') if 'google' in sys.modules: del sys.modules['google']

的帮助下完成

假设您的路线定义如下

reverse routes

在视图中,您可以使用以下代码

来调用它
GET   /hello/:name          controllers.Application.hello(name)

祝你好运