javascript - Submenu (árvore expandida/colapsada) em AngularJS
Eu, no último dia, fiquei preso em encontrar a melhor maneira de usar o Angular para controlar uma lista de menu com submenus.
Com jQuery você pode simplesmente ouvir um evento de clique em um tipo específico de elemento como um <li> e adicionar uma classe ao seu elemento filho para que um menu seja aberto.
Estou tentando fazer a mesma coisa que o menu nesta página http://geedmo.com/themeforest/wintermin/dashboard.html, com Angular. Mas não consigo encontrar a maneira correta de usar minha própria diretiva ou as existentes como ng-hide e ng-show.
Se alguém tiver um exemplo de guias sobre como fazer isso da melhor maneira, meu dia estaria salvo. :)
Também sou novo no Angular, então estou aprendendo algo novo todos os dias.
Resposta #1
Você pode usar o seguinte código para criar um submenu expandido/colapsado no AngularJS.
Eu anexei um exemplo do JSFiddle para você.
<div ng-controller="MyCtrl">
<ul>
<li ng-repeat="item in items" ng-click="showChilds(item)">
<span>{{item.name}}</span>
<ul>
<li ng-repeat="subItem in item.subItems" ng-show="item.active">
<span>---{{subItem.name}}</span>
</li>
</ul>
</li>
</ul>
</div>
Seu controlador JS:
function MyCtrl($scope) {
$scope.showChilds = function(item){
item.active = !item.active;
};
$scope.items = [
{
name: "Item1",
subItems: [
{name: "SubItem1"},
{name: "SubItem2"}
]
},
{
name: "Item2",
subItems: [
{name: "SubItem3"},
{name: "SubItem4"},
{name: "SubItem5"}
]
},
{
name: "Item3",
subItems: [
{name: "SubItem6"}
]
}
];
};
ATUALIZAÇÃO:
Atualizei meu post devido ao seu comentário sobre que, quando clicarmos no novo item do menu, o anterior deve ser recolhido.
Pequenas mudanças no código.
Novo JSFiddle com a sua necessidade.
<div ng-controller="MyCtrl">
<ul>
<li ng-repeat="item in items" ng-click="showChilds($index)">
<span>{{item.name}}</span>
<ul>
<li ng-repeat="subItem in item.subItems" ng-show="item.active">
<span>---{{subItem.name}}</span>
</li>
</ul>
</li>
</ul>
</div>
Seu controlador JS:
function MyCtrl($scope) {
$scope.showChilds = function(index){
$scope.items[index].active = !$scope.items[index].active;
collapseAnother(index);
};
var collapseAnother = function(index){
for(var i=0; i<$scope.items.length; i++){
if(i!=index){
$scope.items[i].active = false;
}
}
};
$scope.items = [
// items array the same with the previous example
];
};
