gpt4 book ai didi

javascript - Play 2.x : How to make an AJAX request with a common button

转载 作者:IT老高 更新时间:2023-10-28 20:21:46 25 4
gpt4 key购买 nike

所以我之前已经成功地让 AJAX 请求工作,但我总是不得不使用一个表单,然后在提交结束时返回 false,这样它就不会刷新页面。

我最近也刚刚将我的 JavaScript 移动到一个单独的文件中,这导致我的 @ 命令失败。因此,我不知道如何将我的 URL 设置为我的路由?

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 sample 中找到使用示例

无论如何,现在您可以通过更改 url 来修复您的 AJAX 调用。到

url : '@routes.Application.saveDefaultPhoneForUser()',

这种方式需要将整个 JS 放到模板中,这是错误的。它可以甚至应该被移动到单独的 JS 文件中,以便您需要使用 javascriptRoutes。

更多...

javascriptRoutes在官方文档中没有描述,这里是一步一步的介绍。虽然描述看起来很复杂事实上使用这种方式带来了很多好处。

1。创建公共(public)路线

首先您需要在 conf/routes 中创建公共(public)路由文件:

GET     /item/:id     controllers.Application.getItem(id: Long)
POST /item/new controllers.Application.newItem
PUT /item/:id controllers.Application.updateItem(id: Long)

当然,您至少需要在Application 中创建这三个操作 Controller :

  • getItem(Long id){ ... }
  • newItem() { ... }
  • updateItem(Long id) { ... }

2。创建一个将公共(public)路由转换为 JS 的操作

  • 把它放在某个地方,即。在您的Application Controller
  • 我们称之为 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()
)
);
}

注意:不要在括号中设置任何参数。

3。为 javascriptRoutes 创建一条路线操作并将其包含在您的模板中

路线 conf/routes

GET     /javascriptRoutes     controllers.Application.javascriptRoutes

查看 <head> /views/main.scala.html 的一部分

<script type="text/javascript" src='@routes.Application.javascriptRoutes()'></script>

4。在你想要的地方使用 javascriptRoutes

从现在开始,您可以在 JS 中使用路由来获取正确的路径,而无需指定 urltype .例如,而不是:

 $('.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.controllers.Application.getItem(idToGet).ajax({
success : function(data) { ... some code ... }
});

myJsRoutes.controllers.Application.newItem().ajax({
success : function(data) { ... some code ... }
});

等等……

  • 您无需指定 type: "POST" - JS 路由器将根据conf/routes 使用正确的方法规则
  • 您可以设置id记录(或其他参数)到GETPUT (或其他方法)使用 routes-like纯 JS 中的语法
  • 如果你的路由规则包含所有必需的参数,你真的可以最小化你的 JS:

路线:

GET   /some/:a/:b/:c    controllers.Application.getABC(a: String, b: Integer, c: String)

JS:

myJsRoutes.controllers.Application.getABC("a", 1, "b" ).ajax({});

关于javascript - Play 2.x : How to make an AJAX request with a common button,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11133059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com