Я пытаюсь заполнить или показать строку подтаблицы, когда нажимается «Уникальный идентификатор». Однако все, что я получаю, - это «undefined».
Я знаю, что мне нужен цикл или что-то, что должно пройти через индекс для подтаблицы (например, subTableData [i] .Description), но тогда моя функция щелчка не работает ..
Кто-нибудь может помочь мне в этом, пожалуйста?
HTML:
<table id = "parentTable">
<thead>
<tr>
<th>Unique ID</th>
<th>Name</th>
<th>Email</th>
<th>Price</th>
<th>Hours</th>
</tr>
</thead>
<tbody id = "parentTableBody">
</tbody>
</table>
<div id = "subTableContainer" style = "display: none;">
<table>
<thead>
<tr>
<th>Description</th>
<th>Arrival</th>
</tr>
</thead>
<tbody id = subTableBody>
<tr>
</tr>
</tbody>
</table>
</div>
jQuery:
$(document).ready(function(){
var arr1 = generateItem();
if (arr1){
var arr2 = [].concat(arr1);
var tr;
$.each(arr2, function(i,e) {
tr = $('<tr>');
tr.append("<td>" + "<a href='#'>" + (e.UniqueId || "") + "</a>" + "</td>");
tr.append("<td>" + (e.Name || "") + "</td>");
tr.append("<td>" + (e.Email || "") + "</td>");
tr.append("<td>" + (e.Price || "") + "</td>");
tr.append("<td>" + (e.Hours || "") + "</td>");
$('#parentTableBody').append(tr);
/* tr = $('<tr>');
tr.append("<td>" + (e.Description || "") + "</td>");
tr.append("<td>" + (e.Arrival || "") + "</td>");
$('#subTableBody').append(tr); */
});
}
});
function generateItem(){
var item = [
{UniqueId: "0",Name: "Alex", Email: "[email protected]", Price: "$20.00", Hours: "1", Description: "N/A", Arrival: "Noon"},
{UniqueId: "1", Name: "Jay", Email: "[email protected]", Price: "$12.00", Hours: "0.2", Description: "Small", Arrival: "Morning"},
{UniqueId: "2" ,Name: "Dylan", Email: "[email protected]", Price: "$32.00", Hours: "2.2", Description: "Heavy", Arrival: "Night"}];
return item;
}
$(function(){
$('#parentTable tbody a').on("click", function(event) {
var idName = $(event.target).text(),
$baseRow = $(event.target).closest("tr");
if ($baseRow.next("tr").find("table").length == 0) {
var subTableData = generateItem(),
subTableHTML = $("#subTableContainer table").clone(true),
descriptionHTML = "<td>" + subTableData.Description + "</td>",
arrivalHTML = "<td>" + subTableData.Arrival + "</td>";
$baseRow.after("<tr><td colspan='4'></td></tr>");
$baseRow.next("tr").find("td").append(subTableHTML);
$baseRow.next("tr").find("#subTableBody tr").append(descriptionHTML).append(arrivalHTML);
} else $baseRow.next("tr").remove();
});
});
Я вернул его обратно, по крайней мере, там, где работала функция щелчка. Спасибо
Привет, Рич. Правильно, идентификаторы могут быть в произвольном порядке. Вы имеете в виду, что для получения номера данных я получаю его с помощью функции .index ('element' или '$ tr') или чего-то подобного? Не уверен, правильно ли я понял последнее утверждение.
Взгляните на решение @Steve. На самом деле это работает очень хорошо. Используя лямбды, он берет уникальный идентификатор, а затем использует .findIndex для получения индекса строки, которую вы хотите просмотреть.
Сделаю. Еще раз спасибо, Рич!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы были на правильном пути; Вам нужно найти индекс выбранного элемента.
var targetIdx = subTableData.findIndex(x => x.UniqueId == idName);
Я также внес изменения в структуру subTable, чтобы исправить это и гарантировать, что на странице не будет нескольких id, а также пару небольших изменений в технике добавления.
$(document).ready(function() {
var arr1 = generateItem();
if (arr1) {
var arr2 = [].concat(arr1);
var tr;
$.each(arr2, function(i, e) {
tr = $('<tr>');
tr.append("<td>" + "<a href='#'>" + (e.UniqueId || "") + "</a>" + "</td>");
tr.append("<td>" + (e.Name || "") + "</td>");
tr.append("<td>" + (e.Email || "") + "</td>");
tr.append("<td>" + (e.Price || "") + "</td>");
tr.append("<td>" + (e.Hours || "") + "</td>");
$('#parentTableBody').append(tr);
/* tr = $('<tr>');
tr.append("<td>" + (e.Description || "") + "</td>");
tr.append("<td>" + (e.Arrival || "") + "</td>");
$('#subTableBody').append(tr); */
});
}
});
function generateItem() {
var item = [{
UniqueId: "0",
Name: "Alex",
Email: "[email protected]",
Price: "$20.00",
Hours: "1",
Description: "N/A",
Arrival: "Noon"
},
{
UniqueId: "1",
Name: "Jay",
Email: "[email protected]",
Price: "$12.00",
Hours: "0.2",
Description: "Small",
Arrival: "Morning"
},
{
UniqueId: "2",
Name: "Dylan",
Email: "[email protected]",
Price: "$32.00",
Hours: "2.2",
Description: "Heavy",
Arrival: "Night"
}
];
return item;
}
$(function() {
$('#parentTable tbody a').on("click", function(event) {
var idName = $(event.target).text(),
$baseRow = $(event.target).closest("tr");
if ($baseRow.next("tr").find("table").length == 0) {
var subTableData = generateItem();
var targetIdx = subTableData.findIndex(x => x.UniqueId == idName); //get the index
var subTableHTML = $("#subTableContainer table").clone(true);
var descriptionHTML = $("<td>").text(subTableData[targetIdx].Description); //modified to shorten
var arrivalHTML = $("<td>").text(subTableData[targetIdx].Arrival); //modified to shorten
$baseRow.after("<tr><td colspan='4'></td></tr>");
$baseRow.next("tr").find("td")
.append(subTableHTML).find("tbody>tr")
.append(descriptionHTML).append(arrivalHTML);
} else $baseRow.next("tr").remove();
});
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id = "parentTable">
<thead>
<tr>
<th>Unique ID</th>
<th>Name</th>
<th>Email</th>
<th>Price</th>
<th>Hours</th>
</tr>
</thead>
<tbody id = "parentTableBody">
</tbody>
</table>
<div id = "subTableContainer" style = "display: none;">
<table>
<thead>
<tr>
<th>Description</th>
<th>Arrival</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>ИЗМЕНИТЬ [0]:
На основании оставленного вами комментария вы хотите, чтобы ваш object array был доступен для редактирования. Это редактирование вносит небольшие изменения в generateItem и позволяет изменять его, сохраняя эти изменения.
$(document).ready(function() {
var arr1 = generateItem();
if (arr1) {
var arr2 = [].concat(arr1);
var tr;
$.each(arr2, function(i, e) {
tr = $('<tr>');
tr.append("<td>" + "<a href='#'>" + (e.UniqueId || "") + "</a>" + "</td>");
tr.append("<td>" + (e.Name || "") + "</td>");
tr.append("<td>" + (e.Email || "") + "</td>");
tr.append("<td>" + (e.Price || "") + "</td>");
tr.append("<td>" + (e.Hours || "") + "</td>");
$('#parentTableBody').append(tr);
/* tr = $('<tr>');
tr.append("<td>" + (e.Description || "") + "</td>");
tr.append("<td>" + (e.Arrival || "") + "</td>");
$('#subTableBody').append(tr); */
});
}
});
var mydata = null;
function generateItem() {
if (mydata == null) {
mydata = [{
UniqueId: "0",
Name: "Alex",
Email: "[email protected]",
Price: "$20.00",
Hours: "1",
Description: "N/A",
Arrival: "Noon"
},
{
UniqueId: "1",
Name: "Jay",
Email: "[email protected]",
Price: "$12.00",
Hours: "0.2",
Description: "Small",
Arrival: "Morning"
},
{
UniqueId: "2",
Name: "Dylan",
Email: "[email protected]",
Price: "$32.00",
Hours: "2.2",
Description: "Heavy",
Arrival: "Night"
}
];
}
return mydata;
}
$(function() {
$('#parentTable tbody a').on("click", function(event) {
var idName = $(event.target).text(),
$baseRow = $(event.target).closest("tr");
if ($baseRow.next("tr").find("table").length == 0) {
var subTableData = generateItem();
var targetIdx = subTableData.findIndex(x => x.UniqueId == idName); //get the index
var subTableHTML = $("#subTableContainer table").clone(true);
var descriptionHTML = $("<td>").text(subTableData[targetIdx].Description); //modified to shorten
var arrivalHTML = $("<td>").text(subTableData[targetIdx].Arrival); //modified to shorten
$baseRow.after("<tr><td colspan='4'></td></tr>");
$baseRow.next("tr").find("td")
.append(subTableHTML).find("tbody>tr")
.append(descriptionHTML).append(arrivalHTML);
} else $baseRow.next("tr").remove();
});
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id = "parentTable">
<thead>
<tr>
<th>Unique ID</th>
<th>Name</th>
<th>Email</th>
<th>Price</th>
<th>Hours</th>
</tr>
</thead>
<tbody id = "parentTableBody">
</tbody>
</table>
<div id = "subTableContainer" style = "display: none;">
<table>
<thead>
<tr>
<th>Description</th>
<th>Arrival</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>Привет, Стив. Ваше решение работало очень хорошо, даже когда у некоторых «Уникальных идентификаторов» нет «Описание» или «Прибытие». Я не знал, что вы можете найти индекс такого элемента. Спасибо! Ваше решение мне действительно помогло. Прямо сейчас я тренируюсь, чтобы увидеть, могу ли я получить строку, если «Уникальный идентификатор» не уникален. Еще раз спасибо.
Это немного беспокоит, если UniqueId не гарантированно уникален. findIndex возвращает элемент соответствия первый.
Привет, Стив. Да, это было непросто, как я думал. Я подумал о том, чтобы создать другой «Уникальный идентификатор» (не тот, который показан в таблице) внутри, куда я добавляю данные для родительской таблицы. Этот новый «newUniqueId» останется скрытым; это просто случайная переменная или значение, которое я генерирую. Это будет отправлено в объект e. Например, «e.newUniqueId = newUniqueId;» Но я просто не могу поместить его в первый соответствующий элемент.
Ваша функция generateItem регенерирует весь массив объектов каждый раз, когда он вызывается, фактически делая его доступным только для чтения, потому что любые изменения будут потеряны, когда вы снова вызовете эту функцию позже. Я изменю эту функцию при редактировании.
Вы можете добавить скрытый столбец, который просто отслеживает, в какой строке вы находитесь, и использовать это значение для получения правильного номера индекса строки. На данный момент ваши идентификаторы 0-> x, увеличиваются, но я предполагаю, что так будет не всегда. Затем в обработчике onClick вам просто нужно получить этот номер для вашего subTableData [rowNum] .Description. \