我有一个jQuery ajax调用,如下所示:
$.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+
答案 0 :(得分:1)
问题在于玩!在提供文件之前生成url,远在执行任何javascript之前。此处没有更改字符串或引号,或者有助于您。
解决方法:
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”。
<强>更新强>
我没玩!在我面前摆弄的实例,但是你可能也可以通过引用XXX直接将字符串作为值插入而不是变量:
var url = '@{Animal.index("XXX")}'.replace('XXX', data[i].name);
然后你就不需要一个名为XXX的变量。细节需要一些游戏,虽然想法是一样的。
答案 1 :(得分:1)
这听起来像是jsAction
tag的工作。它生成一个javascript函数,它与davin的答案一致。
您可以在调用ajax之前将var animalAction = #{jsAction @Animals.index(':name') /};
放在某处,然后将链接生成代码更改为:
${'#tableBody').append('<tr><td>');
${'#tableBody').append('<a href="' + animalAction({ name: data[i].name }) + '">' + data[i].name + '</a>');
${'#tableBody').append('</td></tr>');
您会注意到生成的函数将对象作为其参数,因此它可以支持任意数量的参数。
文档中没有明确说明的是标签(:name
)必须与相应控制器操作(public static void index(String name)
)中参数的名称相同,当然这必须与routes
文件(GET /animals/{name} Animals.index
)中指定的方式相同。
答案 2 :(得分:0)
data是一个javascript对象,你需要指定类似于你如何打印链接的文本。你能试试吗?
${'#tableBody').append('<a href="@{Animal.index(' + data.name + ')}">' + data.name + '</a>');
答案 3 :(得分:0)
你应该改变这一行 -
${'#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>');
答案 4 :(得分: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>');
});
这将取代成功回调中的所有内容