Knockout JS - вкладки в пользовательском элементе управления не форматируются

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

У меня есть одностраничное приложение, использующее 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", поэтому я могу подтвердить, что ссылки правильно содержат правильный выбранный тег и правильно "подсвечиваются" - они есть и есть.

Однако последняя страница форматирует только верхний набор как вкладки, второй набор отображается как неформатированный набор пользовательского интерфейса:

Knockout JS - вкладки в пользовательском элементе управления не форматируются

Функциональность правильная - отображение правильной выбранной страницы и т. д. Если у меня нет второго условного ko для раздела шаблона, он отображает все три, еще одна вещь, которая, я считаю, должна очиститься, когда форматирование вкладки будет применено правильно.

Используемый файл css - jquery-ui-1.10.3.custom.css - я могу закомментировать файл, и верхний набор вкладок имитирует поведение второго.

Ясно, что есть какая-то дополнительная ссылка или тег, который мне нужно нажать, чтобы данные на подстранице были правильно отформатированы, но я не знаю, что это такое. Можно ли иметь только один набор вкладок на странице, и это должен быть какой-то «набор вкладок», о котором я не знаю?

Я предполагаю, что стили должны проходить последовательно (слово «каскад» является частью их названия), но работают ли они по-другому?

Мысли?

У вас есть повторяющиеся идентификаторы, и это может быть причиной форматирования только первого набора вкладок. Любой CSS для #documentsView будет применяться только к первому элементу с этим идентификатором. Кроме того, вы можете столкнуться с той же проблемой для элементов в вашем цикле foreach: bulkTabs, если attr: { id: 'tab-' + name } такой же, как и в верхнем цикле foreach: tabs.

mtr.web 09.03.2018 18:28

Я обновил второй до представления bulkDocuments без изменений. Я обновил второй тег на {id: 'bulktab-' + name}, также без изменений. Я обновил верхний на {href: '# bulktab-' + name} просто в качестве проверки - без мыла. Функциональность остается, форматирование не меняется

VBartilucci 09.03.2018 19:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
65
2

Ответы 2

Да, пользовательский интерфейс 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% исправляют ее.

Другие вопросы по теме