This is how it is done:
Inside your directive all you need is an attribute which gives you access to the name of the card: <card-dealer ng-repeat="card in cards" card="card">
</card-dealer>
in my case my card attribute holds a card object which has a name property. In the directive you set the isolate scope to: scope: { card: '=' }
This isolates and interpolates the card object to the directive scope. You then set the directive template to: template: '<div ng-include="getTemplateUrl()"></div>'
, this looks to the directive's controller for a function named getTemplateUrl. This is what you want because the directive controller has access to the scope object. In the directive controller the getTemplateUrl function looks like this: controller: ['$scope', '$attrs', function ($scope, $attrs) {
$scope.getTemplateUrl = function () {
return '/View/Card?cardName=' + $scope.card.name;
};
}],
I have an mvc controller which links up the proper .cshtml file and handles security when this route is hit, but this would work with a regular angular route as well. In the .cshtml file you set up your dynamic controller by simply putting <div ng-controller="CardContactController"></div>
as the root element. The controller will differ for each card. This creates a hierarchy of controllers which allows you to apply additional logic to all cards in general, and then specific logic to each individual card. I still have to figure out how I'm going to handle my services but this approach allows you to create a dynamic templateUrl and dynamic controller for a directive using an ng-repeat based on the card name alone. It is a very clean way of accomplishing this functionality and it is all self-contained.