I already know what is the purpose of each item in : compile vs link(pre/post) vs controller
So let's say I have this simple code :
HTML
  <body ng-controller="mainController">
    {{ message }}
    <div otc-dynamic=""></div>
  </body>
Controller
app.controller("mainController", function($scope) {
  $scope.label = "Please click";
  $scope.doSomething = function() {
    $scope.message = "Clicked!";
  };
});
Directive
app.directive("otcDynamic", function($compile) {
  var template = "<button ng-click='doSomething()'>{{label}}</button>";
  return {
    compile: function(tElement, tAttributes) {
        angular.element(tElement).append(template);
        for (var i = 0; i < 3; i++) {
          angular.element(tElement).append("<br>Repeat " + i + " of {{name}}");
        }
        return function postLink(scope, element, attrs) {
          scope.name = "John";
        }
      }
  }
});
So as we can see , I modify   the template (at the compile function - which is where it should be actually)
Result ( plnker):
But
I didn't know  that template:... can also take a function.
So I could use the template function instead (plunker)  : 
app.directive("otcDynamic", function() {
  var template1 = "<button ng-click='doSomething()'>{{label}}</button>";
  return {
    template: function(element, attr) {
      element.append(template1);
      for (var i = 0; i < 3; i++)
        element.append("<br>Repeat " + i + " of {{name}}");
    },
    link: function(scope, element) {
      scope.name = "John";
    }
  }
}); 
Question
If so - When should I use the template function vs compile function ? 

 
     
    