Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS directive with default options

I'm just starting with angularjs, and am working on converting a few old JQuery plugins to Angular directives. I'd like to define a set of default options for my (element) directive, which can be overridden by specifying the option value in an attribute.

I've had a look around for the way others have done this, and in the angular-ui library the ui.bootstrap.pagination seems to do something similar.

First all default options are defined in a constant object:

.constant('paginationConfig', {   itemsPerPage: 10,   boundaryLinks: false,   ... }) 

Then a getAttributeValue utility function is attached to the directive controller:

this.getAttributeValue = function(attribute, defaultValue, interpolate) {     return (angular.isDefined(attribute) ?             (interpolate ? $interpolate(attribute)($scope.$parent) :                            $scope.$parent.$eval(attribute)) : defaultValue); }; 

Finally, this is used in the linking function to read in attributes as

.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) {     ...     controller: 'PaginationController',     link: function(scope, element, attrs, paginationCtrl) {         var boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks,  config.boundaryLinks);         var firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true);         ...     } }); 

This seems like a rather complicated setup for something as standard as wanting to replace a set of default values. Are there any other ways to do this that are common? Or is it normal to always define a utility function such as getAttributeValue and parse options in this way? I'm interested to find out what different strategies people have for this common task.

Also, as a bonus, I'm not clear why the interpolate parameter is required.

like image 915
Ken Chatfield Avatar asked Sep 13 '13 10:09

Ken Chatfield


People also ask

What is the default scope in an AngularJS directive?

By default, directives do not create their own scope; instead they use the scope of their parent, generally a controller (within the scope of which the directive is defined). We can change the default scope of the directive using the scope field of the DDO (Data Definition Object).

Which directive is used to start an AngularJS application?

The ng-app directive initializes an AngularJS application. The ng-init directive initializes application data. The ng-model directive binds the value of HTML controls (input, select, textarea) to application data.

What is custom directive in AngularJS?

Custom directives are used in AngularJS to extend the functionality of HTML. Custom directives are defined using "directive" function. A custom directive simply replaces the element for which it is activated.


1 Answers

Use the =? flag for the property in the scope block of the directive.

angular.module('myApp',[])   .directive('myDirective', function(){     return {       template: 'hello {{name}}',       scope: {         // use the =? to denote the property as optional         name: '=?'       },       controller: function($scope){         // check if it was defined.  If not - set a default         $scope.name = angular.isDefined($scope.name) ? $scope.name : 'default name';       }     }   }); 
like image 130
Hunter Avatar answered Sep 23 '22 01:09

Hunter