AngularJS Example

by tjerabek

HTML

<div ng-app="zippyModule">
  <div ng-controller="Ctrl3">
    <div class="zippy" zippy-title="Details: {{title}}...">{{text}}</div>
      <div zippy="test()">test</div>
  </div>
</div>

CSS

</style> <!-- Ugly Hack due to jsFiddle issue: http://goo.gl/BUfGZ --> 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
<style>
.ng-invalid { border: 1px solid red; }
.zippy {
  border: 1px solid black;
  display: inline-block;
  width: 250px;
}
.zippy.opened > .title:before { content: '▼ '; }
.zippy.opened > .body { display: block; }
.zippy.closed > .title:before { content: '► '; }
.zippy.closed > .body { display: none; }
.zippy > .title {
  background-color: black;
  color: white;
  padding: .1em .3em;
  cursor: pointer;
}
.zippy > .body {
  padding: .1em .3em;
}

JavaScript

function Ctrl3($scope) {
  $scope.title = 'Lorem Ipsum';
  $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
}

angular.module('zippyModule', [])
  .directive('zippy', function(){
    return {
      transclude: true,
      scope: { title:'@zippyTitle' },
      // The linking function will add behavior to the template
      link: function(scope, element, attrs) {
            // Title element
          console.log("Test");
        var title = angular.element(element.children()[0]),
            // Opened / closed state
            opened = true;

        // Clicking on title should open/close the zippy
        title.bind('click', toggle);

        // Toggle the closed/opened state
        function toggle() {
          opened = !opened;
          element.removeClass(opened ? 'closed' : 'opened');
          element.addClass(opened ? 'opened' : 'closed');
        }

        // initialize the zippy
        toggle();
      }
    }
  });