您最好在Play中使用JavaScript路由支持。
在你的控制器中,添加以下方法
def jsRoutes = Action { implicit request =>
Ok(Routes.javascriptRouter("jsRoutes")(
controllers.routes.javascript.Application.index))
.as("text/javascript")
}
將其暴露在你的路由文件,即/資產以上/ *文件條目
GET /assets/js/routes controllers.Application.jsRoutes()
GET /assets/*file controllers.Assets.at(path="/public", file)
標籤添加到您的視圖來獲取它生成的JavaScript
<script src="@controllers.routes.Application.jsRoutes()" type="text/javascript"></script>
最後,不要使用jQuery來進行AJAX調用,您可以使用一個對象,它是知道的路由需求:
jsRoutes.controllers.Application.index(id1, id2, etc).ajax({
success : function (data, textStatus, jqXHR) {
// do something on success
},
error: function (jqXHR, textStatus, errorThrown) {
// do something on error
},
complete: function(jqXHR, textStatus) {
// do something on complete
}
});
那裏,如果你改變你的指數()航線使用路徑參數而不是查詢參數這裏是一個額外的好處,不需要改變在JavaScript - 中路由對象會爲你處理。
參考
斯卡拉:http://www.objectify.be/wordpress/?p=746
的Java:http://www.objectify.be/wordpress/?p=734
編輯:對於單頁的應用程序
有您可以使用單頁面應用程序兩種方法。
1.創建一個控制器,公開你想訪問AJAX的每一條路徑。例如,對於路線文件
GET /foo controllers.FooController.foo()
GET /bar controllers.BarController.bar()
你可以有一個(例如,)JsRoutesController控制器,具有如下功能:
def jsRoutes = Action { implicit request =>
Ok(Routes.javascriptRouter("jsRoutes")(
controllers.routes.javascript.FooController.foo)),
controllers.routes.javascript.BarController.bar))
.as("text/javascript")
}
更新您的路由
GET /assets/js/routes controllers.JsRoutesController.jsRoutes()
,然後訪問使用
<script src="/js/routes" type="text/javascript"></script>
或2.的JS對象名在jsRoutes指定它函數(上例中的Routes.javascriptRouter(「jsRoutes」))。每個控制器可以有一個jsRoutes函數,它公開一個特定於控制器的JS路由對象。
在FooController的:
def jsRoutes = Action { implicit request =>
Ok(Routes.javascriptRouter("fooRoutes")(
controllers.routes.javascript.FooController.foo))
.as("text/javascript")
}
在BarController:
def jsRoutes = Action { implicit request =>
Ok(Routes.javascriptRouter("barRoutes")(
controllers.routes.javascript.BarController.bar))
.as("text/javascript")
}
更新你的路由文件
GET /assets/js/foo/routes controllers.FooController.jsRoutes()
GET /assets/js/bar/routes controllers.BarController.jsRoutes()
而在你的頁面
<script src="/js/foo/routes" type="text/javascript"></script>
<script src="/js/bar/routes" type="text/javascript"></script>
任何一種方法都不需要播放2的視圖圖層。
感謝您的詳細解答。這個解決方案很有趣,但我們將客戶端代碼作爲基於emberjs的單頁JavaScript應用程序開發,並且我們不使用視圖元素。所以我們需要在客戶端開發期間嘲笑這個jsRoutes。如何輕鬆實現這一點? – jrabary
2種方式,但細節是必需的;看到更新的答案。 –