播放2.x:如何使用公共按钮发出AJAX请求

use*_*177 59 javascript java ajax routes playframework-2.0

所以我之前已成功获得ajax请求,但我总是不得不使用表单,然后在提交结束时返回false,以便它不刷新页面.

我最近刚刚将我的javascript移动到一个单独的文件中,这导致我的@命令失败.因此,我不知道如何将我的网址设置为我的路线?

HTML:

<button id="saveAsDefaultButton">Save as default</button>
Run Code Online (Sandbox Code Playgroud)

Playframework java代码:

public static Result saveDefaultPhoneForUser(String handset) {
    User currentUser = User.findByName(session("name"));
    currentUser.lastControlledHandset = theHandset;
    currentUser.save();
    return ok();
}
Run Code Online (Sandbox Code Playgroud)

路线:

POST    /                           controllers.Application.saveDefaultPhoneForUser(handset : String)
Run Code Online (Sandbox Code Playgroud)

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;
    });
Run Code Online (Sandbox Code Playgroud)

我确定有办法做到这一点我只是没有运气找到任何东西.任何帮助都很大的帮助.

bie*_*ior 123

对于这项工作,您应该使用javascriptRoutes它,因为它根据您的routes.conf生成正确的JS路径.您将在Zentask 示例中找到使用示例

无论如何,现在你可以通过改变urlto 来修复你的AJAX调用

url : '@routes.Application.saveDefaultPhoneForUser()',
Run Code Online (Sandbox Code Playgroud)

这种方式要求它将整个JS放在模板中,这是错误的.它甚至可以移动到单独的JS文件,并使您可以使用javascriptRoutes.

更多...

javascriptRoutes 尚未在官方文档中描述,但这里是逐步介绍它.虽然描述看起来很复杂但事实上使用这种方式带来了很多好处.

1.创建公共路线

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

GET     /item/:id     controllers.Application.getItem(id: Long)
POST    /item/new     controllers.Application.newItem
PUT     /item/:id     controllers.Application.updateItem(id: Long)
Run Code Online (Sandbox Code Playgroud)

当然,您需要在Application控制器中至少创建这三个动作:

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

2.创建一个将常见路由转换为JS的操作

  • 把它放在某个地方,即.在你的Application控制器中
  • 我们称之为 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()
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

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

3.创建javascriptRoutes操作路线并将其包含在模板中

路线 conf/routes

GET     /javascriptRoutes     controllers.Application.javascriptRoutes
Run Code Online (Sandbox Code Playgroud)

查看<head>部分内容/views/main.scala.html

<script type="text/javascript" src='@routes.Application.javascriptRoutes()'></script>
Run Code Online (Sandbox Code Playgroud)

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;
});
Run Code Online (Sandbox Code Playgroud)

你可以使用简化版(myJsRoutes从第2点开始):

myJsRoutes.controllers.Application.getItem(idToGet).ajax({
    success : function(data) { ... some code ... }
});
Run Code Online (Sandbox Code Playgroud)

要么

myJsRoutes.controllers.Application.newItem().ajax({
    success : function(data) { ... some code ... }
});
Run Code Online (Sandbox Code Playgroud)

等等...

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

路线:

GET   /some/:a/:b/:c    controllers.Application.getABC(a: String, b: Integer, c: String)
Run Code Online (Sandbox Code Playgroud)

JS:

myJsRoutes.controllers.Application.getABC("a", 1, "b" ).ajax({});
Run Code Online (Sandbox Code Playgroud)

  • 不是每个人都可能想使用CoffeScript ..这就是这个官方文档的用武之地. (5认同)
  • 非常感谢Marcus.我确实看过zen任务​​示例但是因为我刚刚回到web dev,所以刷新我的html,css,javascript知识.当这个例子在咖啡脚本中完成时,它让我失望了.当我尝试它时,我无法让它工作. (2认同)
  • 马库斯只是一个简单的问题,如果在我的行动中我做一些服务器端验证然后返回badRequest("发送不正确的数据"); 成功后我也把错误捕获到我的javascript中:错误:function(data){setError('make call failed'); 如何访问我传递的String.当我将错误消息放入接收时,我得到结果'object [Object]'.或者你知道我调试/检查这些信息的方法吗? (2认同)
  • 官方文档中的javascript路由:http://www.playframework.com/documentation/2.1.1/JavaGuide6 (2认同)
  • @biesior我从答案中理解的一件事是,如果ajax调用`url:'@ routes.Application.getItem()',`理论上应该工作.我在这里试过但事实并非如此,并指责说这个论点都没有了.我问的原因是因为我正在考虑将它与jqGrid以类似的方式结合[这里] [http://www.trirand.com/blog/jqgrid/jqgrid.html] (2认同)

ses*_*ses 8

我喜欢"老好"的简单方法:

1在页面中,使用JQuery,

在一些偶数处理程序中

 $.get('/giveme', {'arg': value}, function(data) {

                                    window.alert(data);

                                  }
 );
Run Code Online (Sandbox Code Playgroud)

2在服务器/播放侧

2.1路线: GET /giveme controllers.Application.giveme(arg)

2.2 scala动作:

object Application extends Controller { 

      def giveme(arg:String) = Action {
        Ok(Json.toJson("hello," + arg ))
      }

    }
Run Code Online (Sandbox Code Playgroud)


hoo*_*k38 7

在打电话时需要注意的事项

Routes.javascriptRouter("myJsRoutes",
Run Code Online (Sandbox Code Playgroud)

路线是从play.Routes导入的,而不是play.api.Routes

我实现这段代码时出错了,因为我认为它会来自api(显然我错了).除此之外,一切都很棒〜!!