Angular UI Bootstrap 手风琴切换全部打开

Angular UI Bootstrap accordion toggle open all

手风琴组切换/折叠全部时遇到问题。

只要我不展开/折叠单个手风琴组,展开折叠就可以正常工作。 我希望展开、折叠按钮充当手风琴组的重置按钮。这意味着无论各个组是如何打开的,按下折叠/展开全部都应该适用于所有组。

欢迎提出任何建议。

代码:

 <button class="btn btn-default btn-sm" ng-click="expandAll()">Expand all</button>
    <button class="btn btn-default btn-sm" ng-click="collapseAll()">Collapse all</button>

    <accordion close-others="false">
            <accordion-group is-open="firstGroupOpen">
        <accordion-heading>
            <div>
                First
                <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-up': firstGroupOpen, 'glyphicon-chevron-down': !firstGroupOpen}"></i>
            </div>
        </accordion-heading>
        test
        test
    </accordion-group>

    <accordion-group is-open="secondGroupOpen">
        <accordion-heading>
            <div>
                Second
                <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-up': secondGroupOpen, 'glyphicon-chevron-down': !secondGroupOpen}"></i>
            </div>
        </accordion-heading>
        test
        test
    </accordion-group>
</accordion>

笨蛋在这里:Plunk

发生这种情况是因为 angular 如何处理观察范围变量。有多个修复方法:

  1. 定义一个范围对象并将所有变量分配给该对象(参见下面的示例)
  2. 使用controller as syntax(IMO 最佳解决方案)
  3. 更新变量后使用$scope.apply()(这会触发angular的整个摘要,因此可能是一个繁重的操作)

第一个解决方案示例:

$scope.accordion = {
  firstGroupOpen: false,
  secondGroupOpen: false
}

$scope.expandAll = function () {
    $scope.toggleOpen(true);
};

$scope.collapseAll = function () {
    $scope.toggleOpen(false);
};


$scope.toggleOpen = function (openAll) {
    $scope.accordion.firstGroupOpen = openAll;
    $scope.accordion.secondGroupOpen = openAll;
};

this updated plunker