0

在我看来,我在 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。但是,这种方法很有用,我希望能够参数化由 调用的 URL xhttp.open,所以我想换

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: invalid regular expression flag d

我也尝试过这样做

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

但这告诉我在控制台中的参数列表[了解更多]之后的 SyntaxError: missing )。错误消息指向生成的 HTML (1:13) 标题中的一行,这没有任何意义 - 上面没有任何“()”。但是我没有改变其他任何东西,并且在任何地方都找不到任何丢失的')'。我觉得我很接近,但不能完全明白。

4

1 回答 1

0

我在这里简化了这个问题,答案来自两个响应者:

有两个问题。我正在尝试传递一个字符串文字,并且

@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>
于 2017-07-19T15:24:44.323 回答