Внедрение свойства объекта json в атрибут href якоря с помощью Play! Фреймворк - PullRequest
1 голос
/ 20 июня 2011

У меня есть вызов 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.

Строка json, возвращаемая из вызова ajax, хороша, так как текст ссылки отображается как имя животного, как и ожидалось Я хотел бы передать имя животного действию 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 ]

1 голос
/ 21 июня 2011

Звучит как работа для тега jsAction .Он генерирует функцию javascript, которая работает в том же ключе, что и ответ Дэвина.

Вы бы поместили var animalAction = #{jsAction @Animals.index(':name') /}; где-то перед вызовом ajax, а затем изменили код генерации ссылки на:

${'#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).

1 голос
/ 20 июня 2011

Проблема в том, что Play!генерирует 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 со значением "XXX" на стороне сервера.

UPDATE

Неесть игра!экземпляр передо мной, чтобы возиться, но вместо переменной вы, вероятно, могли бы также вставить строку непосредственно как значение, заключив в кавычки XXX:

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

И тогда вам не понадобится переменная с именемXXX.Детали требуют некоторой проработки, хотя идея та же самая.

0 голосов
/ 20 июня 2011

Вы должны изменить эту строку -

${'#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 голосов
/ 20 июня 2011

Вы перебираете массив 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 голосов
/ 20 июня 2011

данные - это объект javascript, вам нужно указать, что это похоже на то, как вы печатаете текст ссылки. Вы можете попробовать это?

 ${'#tableBody').append('<a href="@{Animal.index(' + data.name + ')}">' + data.name + '</a>');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...