2014-02-10 27 views
0

默認情況下,當一個人有一個途徑是獲得一個列表參數與發揮解析AJAX查詢querystringbind

GET /list controllers.Application.index(ids: List[Long]) 

玩預計,請求URI看起來像

/list?ids=1&ids=2&ids=3 

但jQuery的動作。 AJAX在默認情況下發送請求作爲

/list?ids%5B%5D=1&ids%5B5D=2&ids%5B%5D=3 

Play已經叫做QueryStringBindable可能用於改變這種行爲。不是嗎?如果它可以用來解決這個問題,那麼如何實現可以自定義查詢綁定器? 還是有其他解決方案?

回答

1

您最好在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的視圖圖層。

+0

感謝您的詳細解答。這個解決方案很有趣,但我們將客戶端代碼作爲基於emberjs的單頁JavaScript應用程序開發,並且我們不使用視圖元素。所以我們需要在客戶端開發期間嘲笑這個jsRoutes。如何輕鬆實現這一點? – jrabary

+0

2種方式,但細節是必需的;看到更新的答案。 –