在Scala Play中将反向路由作为JavaScript参数传递

时间:2017-07-19 10:08:36

标签: ajax scala playframework playframework-2.6

我在AJAX中使用反向路由在我的视图中从控制器调用Action:

<script>
                function loadDoc() {
                    var xhttp = new XMLHttpRequest();
                    xhttp.onreadystatechange = function () {
                        if (this.readyState == 4 && this.status == 200) {
                            document.getElementById("toolOptions").innerHTML =
                                    this.responseText;
                        }
                    };
                    xhttp.open("GET", "@routes.MyController.loadTemplate2()", true);
                    xhttp.send();
                }
        </script>

我app.controllers.MyController的控制器有一个方法:

def loadTemplate2() = Action {
    implicit request: Request[AnyContent] => Ok(views.html.template2())
  }

路由如:

GET /mycontroller/retrieve2 controllers.MyController.loadTemplate2

当我对这样的路线进行硬编码并从模板中的某处调用<li onclick="loadDoc()">Load Template 2</li>时,它会按预期工作并加载模板2.但是,这种方法很有用,我希望能够参数化xhttp.open调用的URL,所以我想替换

function loadDoc() function loadDoc(myURL)

xhttp.open("GET", "@routes.MyController.loadTemplate2()", true); xhttp.open("GET", myUrl, true);

然后能够调用我可能拥有的其他方法,比如说:

def loadTemplate3() = Action {
    implicit request: Request[AnyContent] => Ok(views.html.template2())
  }

来自<li>的模板中的其他位置:

<li onclick="loadDoc(@routes.MyController.loadTemplate2())">Load Template 2</li>
<li onclick="loadDoc(@routes.MyController.loadTemplate3())">Load Template 3</li>

但是当我这样做时,它不起作用。控制台告诉我 SyntaxError:无效的正则表达式标志d

我也尝试过这样做

<li onclick="loadDoc(@routes.MyController.loadTemplate2())">Load Template 2.absoluteURL(true)</li>

但这告诉我SyntaxError:missing)在控制台中的参数列表[了解更多]之后。错误消息指向生成的HTML(1:13)标题中的一行,这没有任何意义 - 那里没有任何“()”。但是我没有改变任何其他东西,也无法在任何地方发现任何遗漏。我觉得我很亲密,但不太明白。

1 个答案:

答案 0 :(得分:0)

我在here上简化了这个问题,答案取自两位回应者:

有两个问题。我试图传递一个字符串文字和

@routes.MyController.loadTemplate2()

在呈现的HTML /theUrl/toTheServer

中变成类似的东西

问题是,用/开始表示您将使用正则表达式。

改变这个:

<li onclick="loadDoc(@routes.MyController.loadTemplate2())">Load Template 2</li>

<li onclick="loadDoc('@routes.MyController.loadTemplate2()')">Load Template 2</li>

<li onclick="loadDoc(&quot;@routes.MyController.loadTemplate2()&quot;)">Load Template 2</li>