Angular: Empty Fiddle
http://angularjs.org/
HTML
<!-- template2.html -->
<script type="text/ng-template" id="template1.html">
Hello
<div my-directive></div>
</script>
<div ng-controller="MyCtrl">
<button ng-click="vis = true">Show</button>
<button ng-click="vis = false">Hide</button>
<button ng-click="showHide()">Show-Hide</button>
<div ng-if="vis">
Include:
<div ng-include src="'template1.html'"></div>
</div>
</div>
JavaScript
var myApp = angular.module('myApp',[]);
myApp.config(function($provide) {
$provide.decorator('ngIncludeDirective', function($delegate, $timeout, $http, $templateCache, $anchorScroll, $compile, $animate, $sce) {
var directive = $delegate[0];
var compile = directive.compile;
directive.compile = function(element, attr) {
var srcExp = attr.ngInclude || attr.src,
onloadExp = attr.onload || '',
autoScrollExp = attr.autoscroll;
return function(scope, $element, $attr, ctrl, $transclude) {
var changeCounter = 0,
currentScope,
currentElement;
var cleanupLastIncludeContent = function() {
if (currentScope) {
currentScope.$destroy();
currentScope = null;
}
if(currentElement) {
$animate.leave(currentElement);
currentElement = null;
}
};
scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {
var afterAnimation = function() {};
var thisChangeId = ++changeCounter;
if (src) {
$http.get(src, {cache: $templateCache}).success(function(response) {
setTimeout(function() {
if (thisChangeId !== changeCounter) return;
var newScope = scope.$new();
$transclude(newScope, function(clone) {
cleanupLastIncludeContent();
currentScope = newScope;
currentElement = clone;
currentElement.html(response);
$animate.enter(currentElement, null, $element, afterAnimation);
$compile(currentElement.contents())(currentScope);
currentScope.$emit('$includeContentLoaded');
scope.$eval(onloadExp);
});
},1000);
}).error(function() {
...