Я получаю список объектов в ответе JSON, и я создаю динамические строки таблицы, используя функцию javascript. Таблица не отображает все значения для каждой записи, всего несколько столбцов. Когда пользователь выбирает запись в таблице, я не хочу совершать поездку по серверу, чтобы получить все атрибуты этой записи из базы данных, поэтому я сначала извлек все данные, когда получаю записи, которые будут отображаться в таблице. Теперь, щелкнув по строке, я хочу получить этот объект и отобразить каждый атрибут в форме ниже таблицы.
Моя проблема заключается в том, как хранить/привязывать каждый объект записи к соответствующему тегу <tr>
и извлекать его при клике, поскольку HTML позволяет назначать только значения String для атрибутов тегов. HTML5 позволяет настраивать атрибуты с префиксом "data-", и мы можем получить к ним доступ, используя $("idOfTag").data("atrribute_name_after_data-");
но эти атрибуты также принимают только значение String.
Я знаю, что это может быть не самым эффективным способом, так как есть некоторые другие решения: 1. Сохранение объектов записи в массиве и присвоение только индекса соответствующему тегу, поэтому во время поиска мы получаем индекс от источника события и получаем соответствующий объект из массива. 2. Использование jqGrid для динамического создания таблицы/сетки в соответствии с ответом JSON.
Я хотел бы указать на некоторые вещи здесь.
Во-первых, тот факт, что вы можете хранить строки только по атрибуту data, ничем не ограничивает вас. Я хотел бы запомнить вас, что каждый JSON - это строка, прежде чем вы ее разобрали.
Во-вторых, вы можете создать тег скрипта с типом = 'x-whatever-you-want'. Он не будет интерпретироваться как javascript, и вы можете получить контент позже (как http://handlebarsjs.com/ предлагает на нем главную страницу.)
Наконец, это плохой дизайн. Решение Джозефа Портелли, вероятно, лучше. Просто имейте в виду, что из-за того, как работают замыкания, вы можете легко получить неправильное значение x, если вы немного измените этот код...
Это может быть альтернативный подход к сохранению данных в атрибутах 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]);
}
Основное преимущество здесь заключается в том, что вы можете привязывать любые данные к каждой строке, включая ссылки на элементы и т.д.
Часть, .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);
});