javascript - Alavalikko (laajennettu/pienennetty puu) AngularJS:ssä


Olen viimeisen päivän ajan jumittunut löytämään parhaan tavan käyttää Angularia hallitsemaan valikkolistaa, jossa on alivalikkoja.

jQueryn avulla voit yksinkertaisesti kuunnella klikkaustapahtumaa tietyn tyyppisessä elementissä, kuten <li>, ja lisätä luokan sen alielementtiin, jotta valikko avautuu.

Yritän tehdä samaa asiaa kuin valikko tällä sivulla http://geedmo.com/themeforest/wintermin/dashboard.html, Angularilla. Mutta en löydä oikeaa tapaa käyttämällä omaa direktiiviäni tai olemassa olevia kuten ng-hide ja ng-show.

Jos jollakulla on esimerkki oppaista siitä, miten tämä tehdään parhaalla tavalla, päiväni olisi pelastettu. :)

Olen myös uusi Angularissa, joten opin uusia asioita joka päivä.

Vastaus #1

Voit käyttää seuraavaa koodia luodaksesi laajennetun/pienennetyn alivalikon AngularJS:ssä.

Olen liittänyt sinulle JSFiddle-esimerkin.

<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>

JS-ohjaimesi:

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"}
            ]
        }
    ];
};

PÄIVITYS:

Olen päivittänyt viestini kommenttisi vuoksi siitä, että kun napsautamme uuden valikon kohdetta, edellisen pitäisi supistua.

Pieniä muutoksia koodissa.

Uusi JSFiddle tarpeidesi mukaan.

<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>

Sinun JS-ohjaimesi:

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
    ];
};