2011-06-20 47 views
1

我有一個jQuery Ajax調用,看起來像這樣:使用Play!將json對象屬性注入到錨的href屬性中!框架

$.ajax({ 
     type  : 'GET', 
     dataType : 'json', 
     url  : '/Zoo/animals', 
     success : function(data){ 
      var count = data.length;    
      for(var i = 0; i < count; i++) { 
       ${'#tableBody').append('<tr><td>'); 
       ${'#tableBody').append('<a href="@{Animal.index(data[i].name)}">' + data[i].name + '</a>'); 
       ${'#tableBody').append('</td></tr>'); 
      } 
     } 
    }) 

現在所有的這部作品除了href屬性的罰款。玩!給我下面的錯誤:

Exception raised was NullPointerException : Cannot get property 'name' on null object. 

,但未通過Ajax調用返回的是細如鏈接的文本顯示爲動物的名稱如預期JSON字符串。我想通過動物的名稱到Animal.index行動,但無法這樣做。

更新:

正如其他人所提到的,我也嘗試過這樣的:

${'#tableBody').append('<a href="@{Animal.index(' + data[i].name + ')}">' + data[i].name + '</a>'); 

這只是導致的鏈接:

localhost:9000/animal/index?name=+%2B+data[i].name+%2B+ 

回答

1

問題是打內線的一切!當文件被提供時,在執行任何javascript之前生成url。沒有改變字符串或引號在這裏或那裏會幫助你。

一種解決方法:

var url = "@{Animal.index(XXX)}".replace('XXX', data[i].name); 
${'#tableBody').append('<a href="'+url+'">' + data[i].name + '</a>'); 

這樣玩!在「編譯」時生成它的url,然後javascript在「運行」時簡單地執行替換。不確定是否玩!將查找名爲XXX的變量,如果是這樣,請在服務器端添加名爲XXX的dumby變量值「XXX」。

UPDATE

我沒有玩遊戲!比如在我面前擺弄,但不是一個變量,你很可能還直接引用了XXX插入字符串值:

var url = '@{Animal.index("XXX")}'.replace('XXX', data[i].name); 

然後你就不需要一個名爲XXX的變量。雖然這個想法是相同的,但細節需要稍微玩一下。

+0

除非我做錯了什麼,我嘗試瞭解決方案,但沒有太大的區別。 href url解析後減去data [i] .name。所以鏈接工作(和其他解決方案一樣),但沒有查詢字符串。 – digiarnie

+0

@digiarnie,應該有一個帶有XXX的查詢字符串,它將被JavaScript替換。你明白我的答案與其他人之間的根本區別嗎? – davin

+0

是賓果!那樣做了!非常感謝! – digiarnie

0

數據是一個JavaScript對象,您需要指定與您如何打印鏈接文本相似的內容。你可以試試這個嗎?

${'#tableBody').append('<a href="@{Animal.index(' + data.name + ')}">' + data.name + '</a>'); 
+0

對不起,我應該提到,我已經嘗試過,以及。在這種情況下,玩!解析鏈接爲:http:// localhost:9000/animal/index?name = +%2B + data.name +%2B + – digiarnie

+0

您在更新內容和我的答案中有所不同。我已經將data.name作爲值連接到字符串,但更新後的帖子是不同的。在連接data.name之前,您沒有關閉字符串文字。 – rajasaur

+0

是的。我用我應該輸入的內容更新了OP。 – digiarnie

0

你應該改變這種LINE-

${'#tableBody').append('<a href="@{Animal.index(data[i].name)}">' + data[i].name + '</a>'); 

到這 -

${'#tableBody').append('<a href="@{Animal.index('+data[i].name+')}">' + data[i].name + '</a>'); 
+0

請參閱OP中的更新。 – digiarnie

+0

你應該使用單引號,而不是double.see在我的答案和比較你的帖子..你會得到不同。 – Vivek

+0

對不起,這是我的錯字,實際上我的IDE中有單引號。即它看起來像這樣:$ {'#tableBody')。append('' + data.name + ''); – digiarnie

0

您遍歷數組data但你需要通過索引i這麼喜歡引用每個數據對象data[i]。我想試試這個:

$.each(data, function(k, item) { 
    $('#tableBody').append('<tr><td><a href="@{Animal.index(' + item.name + ')}">' + item.name + '</a></td></tr>'); 
}); 

這將取代你的成功回調

+0

oops,那是我的糟糕的生產代碼到stackoverflow代碼翻譯。我確實在我的生產代碼中正確編制了索引。 – digiarnie

+1

做一個'console.log(data);'語句?只是好奇根據螢火蟲'數據'你的'數據'對象看起來像 – moe

+0

看起來像這樣:[{「name」:「bob1」},{「name」:「bob2」}] – digiarnie

1

這聽起來像是jsAction tag的工作。它生成一個javascript函數,與達文的答案一致。

你會把var animalAction = #{jsAction @Animals.index(':name') /};你的Ajax調用以前在什麼地方,然後改變你的鏈接生成代碼:

你會發現生成的函數接受一個對象作爲它的參數,所以它可以支持多達參數如你所願。

文檔中沒有明確說明的是,標籤(:name)必須與相應控制器操作(public static void index(String name))中的參數名稱相同,當然該名稱必須與其指定方式相同在routes文件(GET /animals/{name} Animals.index)中。

+0

謝謝bemace - 這是黃金! – digiarnie