2017-09-15 3 views
0

Ich beginne gerade mit AngularJs und erstelle eine einfache Website-Navigations-App, die eine API nach Werten abfragt. Derzeit versuche ich ein Akkordeon-Sidebar-Applet zu erstellen (ist das der korrekte Ausdruck für eine Kind-App einer Eltern-App?), Der die primären Sektionen lädt und dann die Kategorien auflistet, wenn auf die Sektions-Kopfzeilen geklickt wird.Angular-UI-Bootstrap Akkordeon klappt gleich nach dem Öffnen zusammen

Nun, ich habe es funktioniert, ohne einen Fehler zu werfen (yay!), Aber wenn ich das CSS anwende, dann wird das Akkordeon schüchtern und schüchtern, nur was weniger als eine Sekunde im Inneren aufdeckt, bevor der Inhalt wieder versteckt wird. Und oft muss ich zweimal auf die Kopfzeile klicken, bevor etwas passiert.

Ich vermute es ist ein Problem mit Bootstrap, denn wie ich bereits erwähnte, ist es nicht so, wenn ich die CSS entfernen und nur Roh-HTML-Ausgabe. Hier ist mein Code:

index.html

<!DOCTYPE html> 
<html ng-app="navApp" ng-strict-di> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/css/bootstrap.min.css" /> 
    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> 
    <!--[if lt IE 9]> 
     <script src="../../assets/js/html5shiv.js"></script> 
     <script src="../../assets/js/respond.min.js"></script> 
    <![endif]--> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular-resource.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular-route.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular-animate.min.js"></script> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js" type="text/javascript"></script> 
    <script src="~/Areas/AngularTest/scripts/app.js"></script> 



</head> 
<body ng-cloak> 
    <div ng-controller="menuController"> 
     <div ng-include src="'templates/sidebar.html'"></div> 
    </div> 
</body> 
</html> 

Grunt Mit meiner js-Dateien in eine app.js so sind hier die einzelnen Stücke zu kombinieren.

scripts/controllers/navController.js

var navApp = angular.module('navApp', [ 
    'ngResource', 
    'ui.bootstrap', 
    'ngAnimate'  
]); 


navApp.controller('menuController', [ 
    '$scope', 
    'navSectionList', 
    'navGetCategories', 

    function ($scope, navSectionList, navGetCategories) { 
     $scope.navSectionList = navSectionList.query(); 
     $scope.getSectionID = function (event) { 

      var sectionID = event.currentTarget.attributes["data-id"].value; 
      $scope.sectionID = sectionID; 

      $scope.navGetCategories = navGetCategories 
       .getResource(sectionID) 
       .query(); 

     }; 
    } 
], 
    function ($scope) { 
     $scope.oneAtATime = true; 
     $scope.status = { 
      isFirstOpen: true, 
      isFirstDisabled: false 
     }; 
    } 

); 

scripts/services/navService.js

navApp.factory('navSectionList', [ 
    '$resource', function ($resource) { 
     return $resource('/api/navigation/section/list', {}, { 
      query: { method: 'GET', params: {}, isArray: true } 
     }); 
    } 
]); 

navApp.factory('navGetCategories', ['$resource', function ($resource) { 
    var service = { 
     getResource: function (sectionID) { 
      return $resource('/api/navigation/category/' + sectionID, {}, { 
       query: { method: 'GET', params: {}, isArray: true } 
      }); 
     } 
    }; 
    return service; 

}]); 

templates/sidebar.html

<div class="sidebar"> 
    <uib-accordion close-others="oneAtATime"> 
     <div uib-accordion-group class="panel-default" heading="Products" is-open="status.isFirstOpen" is-disabled="status.isFirstDisabled"> 
      <ul> 
       <li>New Arrivals</li> 
       <li>On Sale</li> 
      </ul> 
     </div> 
     <div uib-accordion-group class="panel-default" heading="{{section.name}}" ng-click="getSectionID($event)" ng-repeat="section in navSectionList" data-id="{{section.id}}"> 
      <ul ng-repeat="categories in navGetCategories"> 
       <li ng-show="categories.pid == section.id"> 
        {{categories.name}} 
       </li> 
      </ul> 
     </div> 
    </uib-accordion> 
</div> 

Ich verstehe AngularJs an diesem Punkt nicht gut genug, um herauszufinden, was vor sich geht. Was denkst du, sollte ich tun, um das zu beheben?

Antwort

0

Oh Gott, ich habe es wieder getan. Es stellt sich also heraus, dass Sie aufpassen müssen, welche Version von bootstrap.css Sie verwenden. Wenn es eine, die Angular-UI nicht unterstützt, werden Sie all diese lustigen Geschäfte machen.

Das Ersetzen des CSS mit den folgenden half dieses Problem zu beheben.

https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css

Version 4 war für ui.bootstrap zu weit fortgeschritten.

Verwandte Themen