【发布时间】:2017-04-14 20:12:41
【问题描述】:
我有一个父组件,它在 ng-repeat 中创建“n”个子组件。每个子组件在其模板中都有一个手风琴元素(来自 ui-bootstrap 指令)。
从父组件我想使用父组件级别中的链接折叠或展开所有手风琴。每个子手风琴都可以单独展开/折叠,设置本地 vm.isAccordionExpanded 变量。
我打算用$scope.$broadcast()从父母那里通知孩子,他们每个人都会用$scope.$on()拦截事件并设置一个本地布尔变量vm.isAccordionExpanded来分别打开/关闭手风琴。
父组件模板:
<span id="accordionListCommands" ng-if="vm.pastVisits.totalResults > 0">
<span id="collapseAllAccordion">
<a ng-click="vm.collapseAll()" href="">
<i class="fa fa-minus-square" aria-hidden="true"></i></a>
</span>
<span id="expandAllAccordion">
<a ng-click="vm.expandAll()" href="">
<i class="fa fa-plus-square" aria-hidden="true"></i></a>
</span>
</span>
<div ng-repeat="visitItem in vm.pastVisits.data">
<visits-list-component visit="visitItem"></visits-list-component>
</div>
父组件js文件:
$scope.$on('collapse-all-accordion', function () {
vm.isAccordionExpanded = false;
});
$scope.$on('expand-all-accordion', function () {
vm.isAccordionExpanded = true;
});
子模板:
<uib-accordion close-others="false">
<div uib-accordion-group is-open="vm.isAccordionExpanded">
//Rest of the template
有没有更好或更高效的方法来实现这一目标?
【问题讨论】:
-
看起来不错。始终在 ng-repeat 中使用
track by以提高性能。此外,您可以使用is-open="vm.isAccordionExpanded || allExpanded",并将后一个变量设置为 true 以展开全部。 -
感谢您提醒我有关 track bz Index 的信息,我编辑了答案以显示在触发事件时如何设置 vm.isAccordionExpanded 变量。我认为没有添加 allExpanded 变量的逻辑就足够了,还是我遗漏了什么?
-
是的,您的逻辑运行良好,只是它不会设置多个事件侦听器,而是只会在摘要周期内执行此操作。不确定您将获得多少性能。无论如何,您的代码对我来说看起来不错。
标签: javascript angularjs angular-ui-bootstrap