Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Angular... why?</title>
</head>
<body ng-app="app" ng-controller="appCtrl as vm">
  
  <button
    ng-click="vm.toggleGreet()"
    ng-bind="vm.greet ? 'Greeting' : 'Dismissal'"></button>
  
  <table transclude-table>
    <thead>
      <tr>
        <td ng-if="vm.greet">Hello</td>
        <td ng-if="!vm.greet">Goodbye</td>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td ng-bind="vm.greet ? 'Hallo!' : 'Tschüss!'"></td>
      </tr>
    </tbody>
  </table>
  
  <script type="text/ng-template" id="transclude-table-directive.html">
    <div class="wrapper">
      <div class="table-head-wrapper">
        <table class="table-head">
        </table>
      </div>
      <div class="table-body-wrapper">
        <table class="table-body">
        </table>
      </div>
    </div>
  </script>
  
  
</body>
</html>
 
angular.module('app', [])
  .controller('appCtrl', appCtrl)
  .directive('transcludeTable', transcludeTableDirective);
function appCtrl() {
  var vm = this;
  
  vm.greet = true;
  vm.toggleGreet = toggleGreet;
  
  function toggleGreet() {
    vm.greet = !vm.greet;
  }
}
transcludeTableDirective.$inject = ['$templateRequest','$compile'];
function transcludeTableDirective($templateRequest, $compile) {
  var directive = {
    restrict: 'A',
    compile: compile
  };
    
  return directive;
  
  function compile(tElement, tAttrs) {
    var clone = tElement.clone();
    var placeholder = angular.element('<!-- placeholder -->');
    var promise = $templateRequest('transclude-table-directive.html').then(function(templateString) {
      var $template = angular.element(templateString);
      var template = $template[0];
      
      // Make clones of these so we can restore the original element when the scope is destroyed.
      var theadEl = clone.find('thead').clone();
      var tbodyEl = clone.find('tbody').clone();
 
      theadParentEl = angular.element(template.getElementsByClassName('table-head')[0]);
      tbodyParentEl = angular.element(template.getElementsByClassName('table-body')[0]);
      theadParentEl.append(theadEl);
      tbodyParentEl.append(tbodyEl);
      
      return template;
    });
    
    tElement.replaceWith(placeholder);
        
    return link;
    
    function link(scope, element, attrs, controller) {
      
      promise.then(function(template) {
        var replacement = $compile(template)(scope);
        element.replaceWith(replacement);
      });
      
      scope.$on('$destroy', function() {
        // Put everything back to normal
        element.replaceWith(clone);
      });
    }
  }
  
}
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers