我有一個父組件在ng-repeat內創建「n」個子組件。每個子組件在其模板中都有一個手風琴元素(來自ui-bootstrap指令)。
從父組件中,我想使用父組件級別的鏈接摺疊或展開所有手風琴。每個兒童手風琴可以單獨展開/摺疊,設置當地的vm.isAccordionExpanded
變量。
我計劃使用$scope.$broadcast()
作爲父母來通知孩子們,他們每個人都會用$scope.$on()
來攔截事件,並設置一個本地布爾變量vm.isAccordionExpanded
來分別打開/關閉手風琴。AngularJS 1.5 - 迭代和設置子組件的屬性
父組件模板:
<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以展開全部。 – Charleshaa
感謝您提醒我關於track bz Index,我編輯了答案以顯示如何在事件觸發時設置vm.isAccordionExpanded變量。我認爲沒有添加allExpanded變量就足夠了,或者我錯過了什麼? – Francesco
是的,你的邏輯工作的很好,只是它不是設置多個事件監聽器,而只是在摘要循環中執行它。不確定你會獲得多少表現。反正你的代碼對我來說看起來很好。 – Charleshaa