Я углубился в детали, поэтому уверен, что знаю правильный вопрос - давайте посмотрим, как я справился.
У меня есть одностраничное приложение, использующее Knockout 3.4.0. Главная страница с рядом прикрепленных пользовательских элементов управления. У меня есть набор вкладок, определенный на главной странице, и он отлично работает:
<div class = "newportal documentsView" id = "documentsView">
<div class = "tabs">
<ul data-bind = "foreach: tabs">
<li><a data-bind = "attr: { href: '#tab-' + name }, css: { selected: $root.currentTab() == $data }, click: $root.updateTab, text: name"></a></li>
</ul>
<!-- ko foreach: tabs -->
<div class = "area" data-bind = "attr: { id: 'tab-' + name }, template: { name: template, data: $data.model().viewModel }">
</div>
<!-- /ko -->
</div>
</div>
У меня есть второй набор вкладок, определенных на одном из элементов управления, в котором хранится содержимое одной из этих верхних вкладок. Код почти идентичен верхнему, за исключением ссылки на разные данные:
РЕДАКТИРОВАТЬ - повторяющиеся идентификаторы и имена тегов изменены по предложению комментатора - без изменений формата или функциональности.
<div class = "newportal documentsView" id = "bulkDocumentsView">
Welcome to Bulk Documents
<div class = "tabs">
<ul data-bind = "foreach: bulktabs">
<li><a data-bind = "attr: { href: '#bulktab-' + name }, css: { selected: $root.currentBulkTab() == $data }, click: $root.updateBulkTab, text: name"></a>
<!-- ko if: $root.currentBulkTab() == $data -->
(*)
<!-- /ko -->
</li>
</ul>
<!-- ko foreach: bulktabs -->
<!-- ko if: $root.currentBulkTab() == $data -->
<div class = "area" data-bind = "attr: { id: 'bulktab-' + name }, template: { name: template, data: $data.model().viewModel }">
</div>
<!-- /ko -->
<!-- /ko -->
</div>
</div>
</div>
Здесь есть условные выражения "$ root.currentBulkTab", поэтому я могу подтвердить, что ссылки правильно содержат правильный выбранный тег и правильно "подсвечиваются" - они есть и есть.
Однако последняя страница форматирует только верхний набор как вкладки, второй набор отображается как неформатированный набор пользовательского интерфейса:
Функциональность правильная - отображение правильной выбранной страницы и т. д. Если у меня нет второго условного ko для раздела шаблона, он отображает все три, еще одна вещь, которая, я считаю, должна очиститься, когда форматирование вкладки будет применено правильно.
Используемый файл css - jquery-ui-1.10.3.custom.css - я могу закомментировать файл, и верхний набор вкладок имитирует поведение второго.
Ясно, что есть какая-то дополнительная ссылка или тег, который мне нужно нажать, чтобы данные на подстранице были правильно отформатированы, но я не знаю, что это такое. Можно ли иметь только один набор вкладок на странице, и это должен быть какой-то «набор вкладок», о котором я не знаю?
Я предполагаю, что стили должны проходить последовательно (слово «каскад» является частью их названия), но работают ли они по-другому?
Мысли?
Я обновил второй до представления bulkDocuments без изменений. Я обновил второй тег на {id: 'bulktab-' + name}, также без изменений. Я обновил верхний на {href: '# bulktab-' + name} просто в качестве проверки - без мыла. Функциональность остается, форматирование не меняется



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


Да, пользовательский интерфейс jQuery допускает вложенные вкладки. Я предполагаю, что вы вызываете команду jquery UI .tabs() для выбранного, ограниченного только набором внешних / верхних вкладок.
Здесь я вызываю это в селекторе классов:
$(".tabs").tabs();
Я удалил весь внешний CSS и жестко закодировал HTML, поскольку отображаются ваши <ul> и <li>, так как я не думаю, что это проблема Knockout. Вы можете видеть вложенные вкладки, они интерактивны и скрывают невыбранный контент.
$(".tabs").tabs();<link href = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel = "stylesheet"/>
<script src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<div>
<div class = "tabs">
<ul>
<li><a href = "#tab-1" class = "selected">1</a></li>
<li><a href = "#tab-2" class = "">2</a></li>
<li><a href = "#tab-3" class = "">3</a></li>
</ul>
<div id = "tab-1">
<div>
1 - Top level tab content
<div class = "tabs">
<ul>
<li><a href = "#bulktab-1" class = "selected">1</a></li>
<li><a href = "#bulktab-2" class = "">2</a></li>
<li><a href = "#bulktab-3" class = "">3</a></li>
</ul>
<div id = "bulktab-1">
1 - Second level tab content
</div>
<div id = "bulktab-2">
2 - Second level tab content
</div>
<div id = "bulktab-3">
3 - Second level tab content
</div>
</div>
</div>
</div>
<div id = "tab-2">
<div>
2 - Top level tab content
</div>
</div>
<div id = "tab-3">
<div>
3 - Top level tab content
</div>
</div>
</div>
</div>Я не прокрутил достаточно, и если бы я прокручивал, вы все, вероятно, заметили бы проблему.
Второй фрагмент выше содержится (был) в условном выражении, которое проверяет, имеет ли раскрывающийся список выбранное значение.
<!-- ko if: selectedSupplier() -->
<div class = "newportal relative">
<div class = "newportal documentsView" id = "bulkDocumentsView">
Welcome to Bulk Documents
<div class = "tabs">
<ul data-bind = "foreach: bulktabs">
<li><a data-bind = "attr: { href: '#bulktab-' + name }, css: { selected: $root.currentBulkTab() == $data }, click: $root.updateBulkTab, text: name"></a>
<!-- ko if: $root.currentBulkTab() == $data -->
(*)
<!-- /ko -->
</li>
</ul>
<!-- ko foreach: bulktabs -->
<!-- ko if: $root.currentBulkTab() == $data -->
<div class = "area" data-bind = "attr: { id: 'bulktab-' + name }, template: { name: template, data: $data.model().viewModel }">
</div>
<!-- /ko -->
<!-- /ko -->
</div>
</div>
</div>
<!-- /ko -->
Мне могло показаться, что нахождение в таком условном блоке таблицы стилей не позволяет должным образом видеть код - я, вероятно, не говорю об этом должным образом.
Я перемещаю условное выражение, чтобы заблокировать только шаблон внизу (и удаляю мои тестовые условия):
<div class = "newportal relative">
<div class = "newportal documentsView" id = "bulkDocumentsView">
Welcome to Bulk Documents
<div class = "tabs">
<ul data-bind = "foreach: bulktabs">
<li><a data-bind = "attr: { href: '#bulktab-' + name }, css: { selected: $root.currentBulkTab() == $data }, click: $root.updateBulkTab, text: name"></a>
</li>
</ul>
<!-- ko if: selectedSupplier() -->
<!-- ko foreach: bulktabs -->
<div class = "area" data-bind = "attr: { id: 'bulktab-' + name }, template: { name: template, data: $data.model().viewModel }">
</div>
<!-- /ko -->
<!-- /ko -->
</div>
</div>
</div>
И бинго.
Теперь это означает, что для меня будет разумнее разместить отдельный раскрывающийся список на каждой подстранице, но это решит проблему, с которой я столкнулся, как передать выбранные значения в любом случае, так что, вы знаете, две птицы .
98% находят проблему и 2% исправляют ее.
У вас есть повторяющиеся идентификаторы, и это может быть причиной форматирования только первого набора вкладок. Любой CSS для
#documentsViewбудет применяться только к первому элементу с этим идентификатором. Кроме того, вы можете столкнуться с той же проблемой для элементов в вашем циклеforeach: bulkTabs, еслиattr: { id: 'tab-' + name }такой же, как и в верхнем циклеforeach: tabs.