Directives will frequently load HTML templates from outside their definition. When using them in an application, you will need to understand how to properly manage them, how they interact (if at all) with the directive's parent scope, and how they interact with the content nested inside them.
Suppose that you begin with the following skeleton application:
(index.html - uncompiled) <div ng-app="myApp"> <div ng-controller="MainCtrl"> <my-directive> Stuff inside </my-directive> </div> </div> (app.js) angular.module('myApp', []) .controller('MainCtrl', function ($scope) { $scope.overwrite = false; $scope.origin = 'parent controller'; });
Introduce a template to the directive as follows:
(index.html – uncompiled) <div ng-app="myApp"> <div ng-controller="MainCtrl"> <my-directive> Stuff inside </my-directive> </div> <script type="text/ng-template" id="my-directive.html"> <div> <p>Directive template</p> <p>Scope from {{origin}}</p> <p>Overwritten? {{overwrite}}</p> </div> </script> </div> (app.js) angular.module('myApp', []) .controller('MainCtrl', function ($scope) { $scope.overwrite = false; $scope.origin = 'parent controller'; }) .directive('myDirective', function() { return { restrict: 'E', replace: true, templateUrl: 'my-directive.html', link: function (scope) { scope.overwrite = !!scope.origin; scope.origin = 'link function'; } }; });
This snippet will compile the directive element into the following:
(index.html – compiled) <div> <p>Directive template</p> <p>Scope from link function</p> <p>Overwritten? true</p> </div>
Tip
JSFiddle: http://jsfiddle.net/msfrisbie/cojb59b1/
The parent scope from MainCtrl
is inherited by the directive and is provided as the scope
parameter inside the directive's link
function. The directive template is inserted to replace the <my-directive>
tag and its contents, but the supplanting template HTML is still subject to the inherited scope. The link
function is able to modify the parent scope as though it were the directive's own. In other words, the link scope and the controller scope are the same object in this example.
The Directive scope inheritance recipe goes over the basics that involve carrying the parent scope through a directive
The Isolate scope recipe gives details on how a directive can be decoupled from its parent scope
The Directive transclusion recipe demonstrates how a directive handles the application of a scope to the interpolated existing nested content