From 1e00db8daa5c09e7f8f9134f5c94b9a18c7dc425 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 8 Nov 2011 17:19:54 -0800 Subject: [PATCH] fix(directives): make directive names case-insensitive + tests + added docs for angular.directive --- src/Angular.js | 2 +- src/Compiler.js | 1 + src/directives.js | 20 +++++++++++++++++++- test/AngularSpec.js | 23 +++++++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index ab031049ea9e..f1eb74cac957 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -105,7 +105,7 @@ var _undefined = undefined, /** @name angular.attrMarkup */ angularAttrMarkup = extensionMap(angular, 'attrMarkup'), /** @name angular.directive */ - angularDirective = extensionMap(angular, 'directive'), + angularDirective = extensionMap(angular, 'directive', lowercase), /** @name angular.widget */ angularWidget = extensionMap(angular, 'widget', shivForIE), /** @name angular.filter */ diff --git a/src/Compiler.js b/src/Compiler.js index 12736db7adc1..0411c70de60a 100644 --- a/src/Compiler.js +++ b/src/Compiler.js @@ -287,6 +287,7 @@ Compiler.prototype = { }); }); eachAttribute(element, function(value, name){ + name = lowercase(name); fn = directiveFns[name]; if (fn) { element.addClass('ng-directive'); diff --git a/src/directives.js b/src/directives.js index a806e9285b00..ee88e2a5cfb0 100644 --- a/src/directives.js +++ b/src/directives.js @@ -1,7 +1,7 @@ 'use strict'; /** - * @ngdoc overview + * @ngdoc function * @name angular.directive * @description * @@ -39,6 +39,24 @@ * For more information about how Angular directives work, and to learn how to create your own * directives, see {@link guide/dev_guide.compiler.directives Understanding Angular Directives} in * the Angular Developer Guide. + * + * @param {string} name Directive identifier (case insensitive). + * @param {function(string, Element)} compileFn Also called "template function" is a function called + * during compilation of the template when the compiler comes across the directive being + * registered. The string value of the element attribute representing the directive and + * jQuery/jqLite wrapped DOM element are passed as arguments to this function. + * + * The `compileFn` function may return a linking function also called an instance function. + * This function is called during the linking phase when a Scope is being associated with the + * template or template clone (see repeater notes below). The signature of the linking function + * is: `function(Element)` where Element is jQuery/jqLite wrapped DOM Element that is being + * linked. + * + * The biggest differenciator between the compile and linking functions is how they are being called + * when a directive is present within an {@link angular.widget.@ng:repeat ng:repeat}. In this case, + * the compile function gets called once per occurence of the directive in the template. On the + * other hand the linking function gets called once for each repeated clone of the template (times + * number of occurences of the directive in the repeated template). */ /** diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 7831539d215a..299bfb8acc6f 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -427,6 +427,29 @@ describe('angular', function() { }); }); + + describe('directive', function() { + it('should register directives with case-insensitive id', function() { + angularDirective('ALLCAPS', function(val, el) {el.text('+' + val + '+')}); + angularDirective('lowercase', function(val, el) {el.text('-' + val + '-')}); + + var el = jqLite('
' + + '' + + '' + + '' + + 'xx4' + + '
'); + compile(el); + expect(lowercase(sortedHtml(el))).toBe('
' + + '+xx1+' + + '+xx2+' + + '+xx3+' + + '-xx4-' + + '
'); + }); + }); + + describe('isDate', function() { it('should return true for Date object', function() { expect(isDate(new Date())).toBe(true);