因此,我之前已经成功获得了Ajax请求以进行工作,但是我始终必须使用一种表单,然后在提交末尾返回false,以使它不会刷新页面。
最近我也将JavaScript移到了一个单独的文件中,这导致我的@命令失败。因此,我是否不应该将我的网址设置为我的路线?
HTML:
<button id="saveAsDefaultButton">Save as default</button>
Playframework Java代码:
public static Result saveDefaultPhoneForUser(String handset) { User currentUser = User.findByName(session("name")); currentUser.lastControlledHandset = theHandset; currentUser.save(); return ok(); }
路线:
POST / controllers.Application.saveDefaultPhoneForUser(handset : String)
javascript:
$('#saveAsDefaultButton').click(function(evt) { $('#errors').hide(); $.ajax({ type : 'POST', url : "controllers.Application.saveDefaultPhoneForUser", data : $('#controlledPhone option:selected').text(), dataType : "text", success : function(data) { //setError('Call succedded'); //$('#test1').attr("src", data) }, error : function(data) { setError('Make call failed'); } }); return false; });
我确定有办法做到这一点,我只是找不到运气。任何帮助大加赞赏。
对于这项工作,您应该继续使用javascriptRoutes它,因为它会根据routes.conf生成正确的JS路径。您可以在Zentask 示例中找到用法示例
javascriptRoutes
无论如何,现在您可以通过将更url改为来修复AJAX调用
url
url : '@routes.Application.saveDefaultPhoneForUser()',
这种方法要求将整个JS放在模板中,这是错误的。可以甚至应该将其移动到单独的JS文件中,并使其成为可能,您需要使用javascriptRoutes。
更多…
javascriptRoutes 尚未 在官方文档中描述,但这里是逐步的介绍。尽管描述看起来很复杂,但 实际上 使用这种方式会带来很多好处。
首先,您需要在conf/routes文件中创建通用路由:
conf/routes
GET /item/:id controllers.Application.getItem(id: Long) POST /item/new controllers.Application.newItem PUT /item/:id controllers.Application.updateItem(id: Long)
当然,您至少需要在Application控制器中创建以下三个动作:
Application
getItem(Long id){ ... }
newItem() { ... }
updateItem(Long id) { ... }
javascriptRoutes()
在该操作中,您将指向文件中的 现有 路由conf/routes
public static Result javascriptRoutes() { response().setContentType("text/javascript"); return ok( Routes.javascriptRouter("myJsRoutes", routes.javascript.Application.getItem(), routes.javascript.Application.newItem(), routes.javascript.Application.updateItem(), //inside somepackage controllers.somepackage.routes.javascript.Application.updateItem() ) ); }
注意: 请勿在方括号中设置任何参数。
路线 conf/routes
GET /javascriptRoutes controllers.Application.javascriptRoutes
<head>部分检视/views/main.scala.html
<head>
/views/main.scala.html
<script type="text/javascript" src='@routes.Application.javascriptRoutes()'></script>
从现在开始,您可以使用JS中的路由来获取正确的路径,而无需指定urland type。举个例子代替:
type
$('.getAjaxForThisContainer').click(function(e) { var idToGet = $("#someField").val(); $.ajax({ type : 'GET', url : '@routes.Application.getItem()', data : { id: idToGet }, success : function(data) { // ... some code on success } }); return false; });
您可以使用简化版本(myJsRoutes从第2点开始):
myJsRoutes
myJsRoutes.controllers.Application.getItem(idToGet).ajax({ success : function(data) { ... some code ... } });
要么
myJsRoutes.controllers.Application.newItem().ajax({ success : function(data) { ... some code ... } });
等等…
type: "POST"
id
GET
PUT
routes-like
GET /some/:a/:b/:c controllers.Application.getABC(a: String, b: Integer, c: String)
JS:
myJsRoutes.controllers.Application.getABC("a", 1, "b" ).ajax({});