Есть ли способ сохранить объект json в атрибуте default / custom тега HTML, скажем, <tr>

0

Я получаю список объектов в ответе JSON, и я создаю динамические строки таблицы, используя функцию javascript. Таблица не отображает все значения для каждой записи, всего несколько столбцов. Когда пользователь выбирает запись в таблице, я не хочу совершать поездку по серверу, чтобы получить все атрибуты этой записи из базы данных, поэтому я сначала извлек все данные, когда получаю записи, которые будут отображаться в таблице. Теперь, щелкнув по строке, я хочу получить этот объект и отобразить каждый атрибут в форме ниже таблицы.

Моя проблема заключается в том, как хранить/привязывать каждый объект записи к соответствующему тегу <tr> и извлекать его при клике, поскольку HTML позволяет назначать только значения String для атрибутов тегов. HTML5 позволяет настраивать атрибуты с префиксом "data-", и мы можем получить к ним доступ, используя $("idOfTag").data("atrribute_name_after_data-"); но эти атрибуты также принимают только значение String.

Я знаю, что это может быть не самым эффективным способом, так как есть некоторые другие решения: 1. Сохранение объектов записи в массиве и присвоение только индекса соответствующему тегу, поэтому во время поиска мы получаем индекс от источника события и получаем соответствующий объект из массива. 2. Использование jqGrid для динамического создания таблицы/сетки в соответствии с ответом JSON.

  • 1
    Просто держите список рядом и ссылайтесь на него, когда это необходимо.
  • 4
    Просто используйте JSON.stringify для строкового преобразования объекта и сохранения его в атрибуте данных, если это то, что вам нужно, но без какого-либо кода мы действительно не можем вам помочь
Показать ещё 1 комментарий

3 ответа

0

Я хотел бы указать на некоторые вещи здесь.

Во-первых, тот факт, что вы можете хранить строки только по атрибуту data, ничем не ограничивает вас. Я хотел бы запомнить вас, что каждый JSON - это строка, прежде чем вы ее разобрали.

Во-вторых, вы можете создать тег скрипта с типом = 'x-whatever-you-want'. Он не будет интерпретироваться как javascript, и вы можете получить контент позже (как http://handlebarsjs.com/ предлагает на нем главную страницу.)

Наконец, это плохой дизайн. Решение Джозефа Портелли, вероятно, лучше. Просто имейте в виду, что из-за того, как работают замыкания, вы можете легко получить неправильное значение x, если вы немного измените этот код...

0

Это может быть альтернативный подход к сохранению данных в атрибутах HTML.

Если вы динамически генерируете таблицу с помощью JavaScript, вы можете попробовать что-то вроде этого

// assuming this is your data
var data = [
    {name:'Joe',surname:'Jones'},
    {name:'Zack',surname:'Tailor'}
];


var tbl = document.getElementById('mytable');
for(var x = 0; x < data.length; x++) {
    var row = tbl.insertRow(x);


    (function(rowData){
        row.onclick = function() {
            // 'rowData' will contain data related to the clicked row
            console.log(rowData);
        }
    })(data[x]);
}

Основное преимущество здесь заключается в том, что вы можете привязывать любые данные к каждой строке, включая ссылки на элементы и т.д.

  • 0
    Это кажется убедительным, как ItemRenderer в Flex grid. Я попробую это. Спасибо lostsource !!!
0

Часть, .data() только сохранение строковых значений, неверна. Ты можешь сделать:

$('body').data('options', {"name":"Bill"});
var options = $('body').data('options');
console.log( options.name );

Я бы лично просто сохранил идентификатор в tr и использовал его для поиска чего-то в массиве вместо дублирования массива в DOM. Вот краткий пример:

var data = {}
data[123] = {"name":"Bill"};
data[458] = {"name":"Ganesh"};

Затем

<tr data-id="458">

Затем, когда вы щелкнете, вы сможете...

$('tr').on('click', function(){
  var id = $(this).data('id'), obj = data[id];
  console.log('You clicked on: ', obj.name);
});
  • 0
    Спасибо, Билл, но это именно то решение, которое, как я сказал, я имею в виду под номером 1 в своем вопросе. Я хотел что-то динамическое, тесно связанное только с этим конкретным рядом. Как и во Flex, у нас есть ItemRenderer для каждой строки в сетке, и мы определяем функцию, которая имеет доступ к записи этой строки в качестве аргумента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню