2014-10-21 4 views
0

Я пытаюсь создать 3-уровневую навигацию с помощью knockout.js. Из статического шаблона навигации у меня есть информация о том, что класс ul.withsubdrop для 2-го ul-элемента должен быть установлен только в том случае, если присутствует 3-е подменю, иначе нет. Как я могу это сделать, поскольку я оцениваю, существование меню третьего уровня намного позже в коде? Можете ли вы указать мне правильное направление? Спасибо.knockout.js - Как добавить имя класса к элементу

<!-- LEVEL 1 --> 
<ul data-bind="foreach: entries"> 
    <li> 
     <a data-bind="attr: {href: url}, text: title"></a> 


     <!-- LEVEL 2 --> 
     <!-- ko with: $data.menu --> 
     <ul class="withsubdrop" data-bind="foreach: entries"> 
      <li> 
       <a data-bind="attr: {href: url}, text: title"></a> 


       <!-- LEVEL 3 --> 
       <!-- ko with: $data.menu --> 
       <ul data-bind="foreach: entries"> 
        <li><a data-bind="attr: {href: url}, text: title"></a></li> 
       </ul> 
       <!-- /ko --> 


      </li> 
     </ul> 
     <!-- /ko --> 


    </li> 
</ul> 

<script> 
    $.getJSON("/rest/menu/1.0/json", function(allData) { 
     ko.applyBindings(ko.mapping.fromJS(allData)); 
    }); 
</script> 
+0

Можете ли вы показать нам, куда он должен идти? У вас там много html, и это путано читать –

+0

Я упростил код, извините за это. – ttheb

ответ

1

Другой ответ не страшно, но если это строго логика представления я бы не переместить его в виде модели.

<!-- LEVEL 1 --> 
<ul data-bind="foreach: entries"> 
    <li> 
     <a data-bind="attr: {href: url}, text: title"></a> 
     <!-- LEVEL 2 --> 
     <!-- ko with: $data.menu --> 
     <ul class="" data-bind="foreach: entries, css: { 'withsubdrop': menu().entries().length > 0 }"> 
      <li> 
       <a data-bind="attr: {href: url}, text: title"></a> 
       <!-- LEVEL 3 --> 
       <!-- ko with: $data.menu --> 
       <ul data-bind="foreach: entries"> 
        <li><a data-bind="attr: {href: url}, text: title"></a></li> 
       </ul> 
       <!-- /ko --> 
      </li> 
     </ul> 
     <!-- /ko --> 
    </li> 
</ul> 

Вы можете видеть, что я добавил CSS связывания на ул на уровне 2, который проверяет, если меню(). Записей имеет значение больше нуля. Конечно, я предполагаю, что меню является наблюдаемым, а записи - наблюдаемым массивом.

Также имейте в виду, что вам не нужно использовать привязку $ data в вашем представлении, как и вы, поскольку это уже заданная область. Обычно вы будете использовать $ data, когда вы привязываетесь непосредственно к существующей области и не определяете свойство этой области.

+0

Это лучший ответ, так как вопрос, кажется, строгое изложение. –

+0

Спасибо за ответ, к сожалению, он не работает с моим кодом, я получаю ReferenceError ko не определено и меню не определено. Может быть, в моем коде есть ошибки? Я обновил свой внутренний вопрос и добавил код javascript. Я использую плагин отображения. Я также намеренно использовал $ data.menu, так как я получал ошибки без него, так как JSON не всегда возвращает свойство меню, если нет навигации 2-го или 3-го уровня. Должен ли я лучше попробовать и построить модель самостоятельно, вместо использования плагина отображения? Является ли проблема, я связан с плагином отображения? – ttheb

+0

Ссылка ko не определена означает, что нокаут не работает на вашей странице вообще. Это просто означает, что вы не загружаете нокаут. Меню не определено. Ошибка будет в вашей модели просмотра. Это отдельные вопросы, хотя и очень простые и легко исправить. –

1

В вашем JavaScript есть булевское поле thirdSubmenuPresent.

В вашем HTML, вы будете привязки данных выглядеть следующим образом:

<ul class="dropdown-menu" data-bind="foreach: entries, css: { withsubdrop: thirdSubmenuPresent }" role="menu"> 
+0

Спасибо, можете ли вы подробнее рассказать о том, как я могу это сделать? Я сейчас полностью полагаюсь на плагин отображения нокаута, поэтому мой javascript - это просто: $ .getJSON («/ rest/menu/1.0/json», function (allData) { ko.applyBindings (ko.mapping.fromJS (allData)); }); Я просто использую на данный момент, чтобы проверить меню третьего уровня. – ttheb

+0

Читая ваш вопрос немного ближе, я рекомендую ответить @PW Kad. –

Смежные вопросы