如何在javascript中重定向到播放框架网址而无需对网址进行硬编码

时间:2016-01-01 14:10:23

标签: javascript redirect playframework routes

我需要做一些看似很简单的事情。

以同样的方式,从我的scala.html文件中,创建指向另一个网址/entry的链接,我需要从javascript文件中执行此操作。

,即来自scala.html:

    <div class="footer">
        <a href='@routes.Application.index()'>Home</a>
    </div>

来自我的javascript活动:

function() myEvent {
    window.location="@routes.Application.entry()"; // DOESN'T WORK!
}

对于从javascript进行路由,我已经必须设置我的javascript路由以进行一些我已经不得不做的ajax工作。

我的ajax工作是调用方法&#39; findPersons()&#39;所以在我的Application.java文件中,我已经:

public Result jsRoutes()
{
    response().setContentType("text/javascript");
    return ok(Routes.javascriptRouter(  "appRoutes",
                                        routes.javascript.Application.findPersons()));
}

因为我希望能够重定向到我的GET entry()方法,所以我将其修改为如下所示:

public Result jsRoutes()
{
    response().setContentType("text/javascript");
    return ok(Routes.javascriptRouter(  "appRoutes",
                                        routes.javascript.Application.findPersons(),
                                        routes.javascript.Application.entry()));
}

另外,我在路线文件中有这些:

GET     /entry              controllers.Application.entry()

POST    /findPersons        controllers.Application.findPersons()

当我调用findPersons方法时,它非常简单。 它看起来像这样:

appRoutes.controllers.Application.findPersons().ajax({
    data: {
        personIdentifier : personIdentifier,
        surname : surname, 
        givenNames : givenNames
    },
    success : processDBQuery
});

对于我的简单重定向,我希望能够在我的html / javascript代码和url之间保持相同的松散耦合,因为我可以在上面调用ajax。

我的重定向需要在事件中发生。因此,最简单,最快捷的解决方案很简单:

function() myEvent {
    window.location="/entry";
}

但是,然后我会对URL进行硬编码(我已经设法避免上面的ajax调用),不再保持我非常喜欢的松散耦合。

但是,我在文档中看不到任何示例,并且从生成的javascript(对于我的路由)中看到的内容没有机会。

有没有办法实现我的目标?

感谢阅读!

p.s。,我应该补充;我想我也想过使用生成的ajax调用的可能性,我想我可能会获取我想要的页面...并且可能有一种方法用获取的页面的整个内容替换当前文档。但那听起来很糟糕......错了......

是不是?

我非常希望替换,就像在我的html

中所做的那样

,即上面显示的链接生成如下:

    <div class="footer">
        <a href='/'>Home</a>
    </div>

同样地,我希望在javascript中有一些替换方法,以便上面的事件函数最终被按下来看起来像这样:

function() myEvent {
    window.location="/entry";
}

1 个答案:

答案 0 :(得分:0)

Jacques,从上面的评论中,帮助我实现了解决方案。

来自我的&#34;资产位于&#34; javascript文件,我仍然可以参考位于javascript的页面/模板。

自己的文件/资产定位javascript似乎没有改变我的预期。 但是,页面/模板定位的javascript 完全按照我的要求进行了转换。

我可以从我的资产javascript找到一个位于javascript函数的模板。

这意味着,我在模板中有一个额外的小功能,可以为我重定向。

即,

<强> myJavascript.js:

    function personResultsListClickHandler(personId) {
        var fpersonId = personId;
        return function() {
            window.alert("hello! " + fpersonId);
            affectRedirect();
        };
    }

<强> myTemplate.scala.html

@main("person lookup") {

    <script type="text/javascript">
        function affectRedirect(){  
            window.location="@routes.Application.entry()";
        } // Need this here so it will be transformed.
          // asset located javascript doesn't seem to get transformed like javascript here in template! :(...
    </script>

另一种可能性是通过调用

检索Javascript对象

appRoutes.controllers.Application.entry()

包含网址成员。这个url成员正是我可以用来分配给window.location的。然而,它看起来有点非官方...... 1.成员没有记录 2.不确定将来是否存在url成员 3.生成的javascript正在构建一个处理ajax的对象...而我只是抓住它的URL成员......它只是感觉......就像一个黑客。

但是我已经对此进行了测试,但它确实有效。请参阅以下代码:

    function patientResultsListClickHandler(personId) {
        var fpersonId = personId;
        return function() {
            window.location=appRoutes.controllers.Application.entry(personId).url;
        //  window.location="/entry/" + fpersonId; // the sort of hard-coding of URL that
        };                                          // I wanted to avoid, but don't seem able to.
    }

还有其他人有更好的解决方案吗?