ОК, так что этот ответ не исправляет ошибку в вашем коде, но я хотел бы опубликовать немного более общее и, возможно, лучшее решение, учитывая, что оно использует некоторые из лучших практик.
Приведенный ниже пример работает с любым количеством уровней в иерархии, включая сложные сценарии, в которых вы хотите предоставить особый режим родителю только с одним ребенком. Он также использует Font Awesome, чтобы получить лучший глиф (особенно полезно, если вы используете Bootstrap). Кроме того, вместо использования jquery toggle на произвольном элементе, вы можете установить флажок для элемента, который имеет встроенное состояние переключения.
Итак, начнем с разметки вашего стола. Сначала вы должны поместить символы +/- в одну из ячеек таблицы следующим образом:
<tr><td>
<input type="checkbox" id="parent1" class="txRowExpanderControl" checked>
<label class="txRowExpanderControlLabel" for="parent1">
<i class="rowsExpandIcon"></i>
</label>{{title}}
</td></tr>
Строки, которые должны быть свернуты / развернуты, должны быть помечены атрибутом данных следующим образом.
<tr data-expanderid="parent1">...</tr>
<tr data-expanderid="parent1">...</tr>
Затем ваши связанные классы CSS будут выглядеть следующим образом (обратите внимание, что я использую LESS, но если вы этого не сделаете, вы можете напрямую встроить классы fa * в свою разметку):
.txRowExpanderControl {
display:none; //don't show checkbox
}
.txRowExpanderControlLabel {
cursor: pointer; //cursor same as link
}
.rowsExpandIcon:extend(.fa all):extend(.fa-plus-square-o all) {
}
.rowsCollapseIcon:extend(.fa all):extend(.fa-minus-square-o all) {
}
.txRowVisible {
display:table-row;
}
.txRowCollapsed {
display:none;
}
Наконец, ваш JavaScript будет выглядеть следующим образом. Обратите внимание, что я использую делегированные события, которые лучше, чем прямое связывание, а также вместо переключения jQuery, я использую явное включение / выключение, чтобы все было легко отлаживаемым.
$("#myTable").delegate(".txRowExpanderControl", "click", function () {
var currentState = $(this).prop("checked");
var expanderId = $(this).attr("id");
var childRows = $(this).closest("tr").nextAll("tr[data-expanderid=\"" + expanderId + "\"]");
var expanderIcon = $(this).next("label[for=\"" + expanderId + "\"]").children("i");
if (currentState) {
childRows.attr("class", "txRowCollapsed");
expanderIcon.attr("class", "rowsExpandIcon");
}
else {
childRows.attr("class", "txRowVisible");
expanderIcon.attr("class", "rowsCollapseIcon");
}
});