0

Ich stieß auf ein seltsames Problem. Ich hatte meine eigene Direktive geschrieben. Ich versuche,AngularJs Akkordeon nicht öffnen mit Is-Open-Attribut

zu verwenden, ist offen

Attribut angeben, wenn Akkordeon Gruppe $scope.state genannt, basierend auf Modell geöffnet werden muss. Leider ist es die Eigenschaft isOpen ist immer falsch, auch wenn es in checked() Funktion geändert wird.

Directive.html

<accordion> 
    <accordion-group class="my-panel-body" ng-class="{'my-panel-heading-checked':state.isOpen,'my-panel-heading-default':!state.isOpen}" is-open="state.isOpen"> 
     <!--Accordion header --> 
     <accordion-heading id="{{groupId}}" > 
      <div ng-click="checked()" > 
       <i class="pull-left glyphicon" ng-class="status"></i> {{title}} 
      </div> 
     </accordion-heading> 

     <!--Accordion content --> 
    </accordion-group> 
</accordion> 

Directive.js

angular.module('locale'). 
    directive('accordionList', function() { 
     return{ 
      restrict: 'A', 
      scope: { 
       title: '=', 
       result: '=', 
       groupId: '=' 
      }, 
      templateUrl: 'html/accordionList.html', 
      controller: function($scope){ 

      var glyphicon = 'glyphicon glyphicon-'; 
      var status = glyphicon + 'unchecked'; 
      $scope.state = { 
       isOpen: false 
      } 
      $scope.status = status; 

      $scope.checked = function(){ 
       console.log($scope.state.isOpen) //It is always false! 
       if ($scope.state.isOpen) { 
        $scope.state.isOpen = false; 
        $scope.status = status; 
       } 
       else { //Always entering this part of code! 
        console.log("FLAG"); 
        $scope.state.isOpen = true; //True only here when invoked. 
        $scope.status = glyphicon + 'check'; 
        console.log($scope.state.isOpen); 

       } 
      }   
     } 
    }; 

});

Ich wäre dankbar für jede Hilfe. Ich habe keine Ahnung, was nicht funktioniert.

+0

Können Sie einen Plünderer oder Geige dafür machen? – varit05

Antwort

0

Basierend auf Ihrem bereitgestellten Code, habe ich eine plunker erstellt, um Ihr Problem zu reproduzieren, und es zeigt das Problem.

Tatsache ist, dass die accordion-group Direktive automatisch eine toggleOpen Funktion an ein Klickereignis bindet (siehe template). In diesem Fall wird mit Ihrer eigenen checked-Funktion Ihr Wert isOpen zweimal geändert, wenn auf Element geklickt wird, und bleibt somit unverändert.

so beseitigen Sie einfach die "check()" oder stoppen Sie die Änderung isOpen Wert darin.

$scope.checked = function(){ 

       console.log($scope.state.isOpen) //It is always false! 
       if ($scope.state.isOpen) { 
        //$scope.state.isOpen = false; 
        $scope.status = status; 
       } 
       else { //Always entering this part of code! 
        console.log("FLAG"); 
        // $scope.state.isOpen = true; //True only here when invoked. 
        $scope.status = glyphicon + 'check'; 
        console.log($scope.state.isOpen); 

       } 
      } 
+0

danke für schnelle responne. Ich werde morgen nachsehen, ob das Problem behoben wird. – Dago

+0

hmm, es hat geholfen, aber jetzt habe ich keine Ahnung, wie ich zum Beispiel die Funktion aufrufen kann, wenn mein Akkordeon zusammenbricht. Wenn ich darauf klicke, um es zu schließen, ist $ scope.state.isOpen in der Funktion checked() wahr, wenn es geschlossen wird. Aber ich würde gerne ein paar Sachen machen, wenn $ scope.state.isOpen schon falsch ist (nachdem ich kollabiert und die Funktion überprüft habe. Wie könnte ich das erreichen> – Dago

Verwandte Themen