it-swarm.com.ru

Переключение иконок панели аккордеона с помощью ng-class и ng-click

У меня есть аккордеон с иконками "шеврон", которые переключаются, чтобы указывать вверх или вниз при нажатии, это делается с помощью ng-click и ng-class. Аккордеон позволяет открывать только одну панель одновременно - поэтому, когда я нажимаю на панель, которая закрыта, панель, которая открыта, закрывается. Но как мне переключить значок шеврона на открытой панели, которая закрывается с помощью ng-click?

Первоначально я мог сделать это с помощью манипуляций с DOM и т.д., Но поскольку это частичное представление в angular, я не могу этого сделать.

Код:

<div class="panel-group" id="accordion">
  <div class="panel panel-default">
    <div class="panel-heading">
      <h4 class="panel-title">
        <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" ng-click="firstpaneisopen=!firstpaneisopen">
           <i class="glyphicon" ng-class="{'glyphicon-chevron-up': firstpaneisopen, 'glyphicon-chevron-down': !firstpaneisopen}"></i> Collapsible Group Item #1
         </a>
      </h4>
     </div>
    <div id="collapseOne" class="panel-collapse collapse in">
     <div class="panel-body">
       Body
     </div>
    </div>
  </div>
  <div class="panel panel-default">
   <div class="panel-heading">
     <h4 class="panel-title">
       <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" ng-click="secondpaneisopen=!secondpaneisopen>
         <i class="glyphicon" ng-class="{'glyphicon-chevron-up': secondpaneisopen, 'glyphicon-chevron-down': !secondpaneisopen}"></i> Collapsible Group Item #2
       </a>
     </h4>
    </div>
    <div id="collapseTwo" class="panel-collapse collapse">
     <div class="panel-body">
       Body
     </div>
    </div>
   </div>
 </div>
8
bjornasm

Я бы порекомендовал вам проверить 'UI Bootstrap' от команды AngularUI. Это коллекция "компонентов Bootstrap, написанных на чистом AngularJS".

http://angular-ui.github.io/bootstrap/

На их веб-сайте есть пример, который показывает их директиву Accordion с использованием ng-class для переключения значков шеврона.

http://angular-ui.github.io/bootstrap/#/accordion

Их директива также имеет атрибут close-others, который, если имеет значение true, будет гарантировать, что одновременно будет открыта только одна панель.

<accordion close-others="true">
3
Andrew Sula

Это то что я пробовал и похоже работает

У меня в контроллере есть

$scope.menuStatus = [   { isOpen : true     },
                        { isOpen : false    }, 
                        { isOpen : false    } ]

В моем HTML у меня есть

<accordion id='cntLeftMenu' close-others='false'>
    <accordion-group is-open='menuStatus[0].isOpen'>
        <accordion-heading class='menu-title'>
            Cars <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': menuStatus[0].isOpen , 'glyphicon-chevron-right': !menuStatus[0].isOpen }"></i> 
        </accordion-heading>
        <ul class='left-menu'>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
        </ul>

    </accordion-group>

    <accordion-group is-open='menuStatus[1].isOpen'>
        <accordion-heading class='menu-title'>
            Customers <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': menuStatus[1].isOpen , 'glyphicon-chevron-right': !menuStatus[1].isOpen }"></i> 
        </accordion-heading>
        <ul class='left-menu'>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
        </ul>

    </accordion-group>

    <accordion-group is-open='menuStatus[2].isOpen'>
        <accordion-heading class='menu-title'>
            Staff <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': menuStatus[2].isOpen , 'glyphicon-chevron-right': !menuStatus[2].isOpen }"></i> 
        </accordion-heading>
        <ul class='left-menu'>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
            <li><a href=''>test1</a></li>
        </ul>

    </accordion-group>


<accordion>
3
Clinton

Как насчет работы с CSS? Bootstrap добавляет класс collapsed к элементу html, который имеет data-toggle="collapse". Когда слайд открывается, он удаляет этот класс collapsed. Затем мы можем работать с css, например, чтобы повернуть элемент span (дочерний элемент элемента с атрибутом data-toggle).

<style>

 button.collapsed span {
  transform: rotate(-90deg);
 }
</style>
<button type="button" class="btn btn-info collapsed" data-toggle="collapse" data-target="#demo">
 Simple collapsible
 <span class="glyphicon glyphicon-chevron-down"></span>
</button>
<div id="demo" class="collapse">
 Lorem ipsum dolor...
</div>

ВАЖНОЕ ПРИМЕЧАНИЕ : Убедитесь, чтоcollapsedкласс добавлен к элементу с атрибутом data-toggle="collapse", чтобы это работало гладко. В противном случае, при начальной загрузке элемента, элемент span не поворачивается, как ожидалось в первый раз.

3
Akash

Сделав некоторые исследования, я смог использовать этот метод , чтобы добавить класс open в panel-header, когда он был открыт. Этот пример позволяет открывать несколько панелей и использует Angular Strap Collapse .

Шаблон: 

<div class="panel-group" 
     role="tablist" 
     data-ng-model="multiplePanels.activePanels" 
     data-allow-multiple="true" 
     data-bs-collapse>
   <div class="panel panel-default" ng-repeat="location in locations">
       <div class="panel-heading" 
            role="tab" 
            data-ng-class="{'open' : multiplePanels.activePanels.indexOf($index) > -1}"
            bs-collapse-toggle>
            <h3>Some Header Stuff</h3>
       </div>
       <div class="panel-collapse" role="tabpanel" bs-collapse-target>
            <div class="panel-body">
                <p>Stuff in the panel body...</p>
            </div>
       </div>
   </div>
</div>

JS в контроллере:

$scope.multiplePanels.activePanels = [];
2
BrandonReid

Самое простое решение, которое я когда-либо думал. И не использовать какой-либо контроллер,

<div 
  class="fa fa-fw list-arrow" 
  ng-class="{'fa-angle-down': isClicked, 'fa-angle-right' : !isClicked}" 
  ng-click="isClicked = !isClicked">
</div>

Вы можете написать подобное, как я. 

2
Ashraful Islam

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

JS:

$scope.firstpaneisopen = false;
$scope.secondpaneisopen = false;

Модифицированный нг-клик на первой панели:

<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" ng-click="firstpaneisopen=!firstpaneisopen; secondpaneisopen=false">

наоборот на второй панели.

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

0
bjornasm

Вы можете использовать bootstrap (проверено в 4+) свернуть и следующие стили для переключения кнопки;

<style>
    [id^='particon'] {
      display: block !important;
    }

    [id^='particon']:after {
      font-family: 'Glyphicons Halflings';
      color: grey;
    }

    [id^='particon'].collapse:after {
      content: "\e081";
    }

    [id^='particon'].collapse.show:after {
      content: "\e082";
    }

    /*optional*/
    [id^='particon'].collapsing {
      transition: none;
    }
</style>

Для полностью работающего снипплета;

https://js.do/code/changecollapseicon

0
Kemal Kaplan