我必须在Web项目中使用Play Framework,我必须将视图与控制器类连接起来。意思是,我必须在视图(scala.html)中使用在控制器(scala)中声明的方法。 我真的不知道怎么做。 我尝试过像
这样的事情 @controller.class.method()
但它没有用。 我已经查了一下,但一无所获,也许是因为它太简单了,任何人都会问它......?
我很感激帮助。
答案 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)
祝你好运