使用Play将json对象属性注入锚点的href属性!骨架

时间:2011-06-20 06:38:21

标签: javascript jquery ajax playframework

我有一个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+

5 个答案:

答案 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>');
});

这将取代成功回调中的所有内容