(angular => { 'use strict'; angular.module('oc.lazyLoad').directive('ocLazyLoad', function($ocLazyLoad, $compile, $animate, $parse, $timeout) { return { restrict: 'A', terminal: true, priority: 1000, compile: function(element, attrs) { // we store the content and remove it before compilation var content = element[0].innerHTML; element.html(''); return function($scope, $element, $attr) { var model = $parse($attr.ocLazyLoad); $scope.$watch(() => { return model($scope) || $attr.ocLazyLoad; // it can be a module name (string), an object, an array, or a scope reference to any of this }, moduleName => { if(angular.isDefined(moduleName)) { $ocLazyLoad.load(moduleName).then(() => { // Attach element contents to DOM and then compile them. // This prevents an issue where IE invalidates saved element objects (HTMLCollections) // of the compiled contents when attaching to the parent DOM. $animate.enter(content, $element); // get the new content & compile it $compile($element.contents())($scope); }); } }, true); }; } }; }); })(angular);