diff --git a/src/ng/compile.js b/src/ng/compile.js
index 66677a3b5a80..5a8103d7f024 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -213,7 +213,7 @@
* String of subset of `EACM` which restricts the directive to a specific directive
* declaration style. If omitted, the default (attributes only) is used.
*
- * * `E` - Element name: ``
+ * * `E` - Element name (default): ``
* * `A` - Attribute (default): `
`
* * `C` - Class: ``
* * `M` - Comment: ``
@@ -581,7 +581,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
directive.index = index;
directive.name = directive.name || name;
directive.require = directive.require || (directive.controller && directive.name);
- directive.restrict = directive.restrict || 'A';
+ directive.restrict = directive.restrict || 'EA';
directives.push(directive);
} catch (e) {
$exceptionHandler(e);
diff --git a/src/ng/directive/attrs.js b/src/ng/directive/attrs.js
index 6b230a75150c..8047e35d0960 100644
--- a/src/ng/directive/attrs.js
+++ b/src/ng/directive/attrs.js
@@ -351,6 +351,7 @@ forEach(BOOLEAN_ATTR, function(propName, attrName) {
var normalized = directiveNormalize('ng-' + attrName);
ngAttributeAliasDirectives[normalized] = function() {
return {
+ restrict: 'A',
priority: 100,
link: function(scope, element, attr) {
scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index fb3ee0577946..f1421da5a934 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -2150,6 +2150,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
*/
var ngModelDirective = function() {
return {
+ restrict: 'A',
require: ['ngModel', '^?form', '^?ngModelOptions'],
controller: NgModelController,
link: {
@@ -2251,6 +2252,7 @@ var ngModelDirective = function() {
*
*/
var ngChangeDirective = valueFn({
+ restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
ctrl.$viewChangeListeners.push(function() {
@@ -2262,6 +2264,7 @@ var ngChangeDirective = valueFn({
var requiredDirective = function() {
return {
+ restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
@@ -2281,6 +2284,7 @@ var requiredDirective = function() {
var patternDirective = function() {
return {
+ restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
@@ -2311,6 +2315,7 @@ var patternDirective = function() {
var maxlengthDirective = function() {
return {
+ restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
@@ -2329,6 +2334,7 @@ var maxlengthDirective = function() {
var minlengthDirective = function() {
return {
+ restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
@@ -2430,6 +2436,7 @@ var minlengthDirective = function() {
*/
var ngListDirective = function() {
return {
+ restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
// We want to control whitespace trimming so we use this convoluted approach
@@ -2526,6 +2533,7 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
*/
var ngValueDirective = function() {
return {
+ restrict: 'A',
priority: 100,
compile: function(tpl, tplAttr) {
if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
@@ -2688,6 +2696,7 @@ var ngValueDirective = function() {
*/
var ngModelOptionsDirective = function() {
return {
+ restrict: 'A',
controller: ['$scope', '$attrs', function($scope, $attrs) {
var that = this;
this.$options = $scope.$eval($attrs.ngModelOptions);
diff --git a/src/ng/directive/ngBind.js b/src/ng/directive/ngBind.js
index 8c5a4dba0805..a0cf67665d9a 100644
--- a/src/ng/directive/ngBind.js
+++ b/src/ng/directive/ngBind.js
@@ -178,6 +178,7 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
*/
var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {
return {
+ restrict: 'A',
compile: function (tElement, tAttrs) {
tElement.addClass('ng-binding');
diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js
index eb4fc8bdd4ee..452f88f260c1 100644
--- a/src/ng/directive/ngController.js
+++ b/src/ng/directive/ngController.js
@@ -221,6 +221,7 @@
*/
var ngControllerDirective = [function() {
return {
+ restrict: 'A',
scope: true,
controller: '@',
priority: 500
diff --git a/src/ng/directive/ngEventDirs.js b/src/ng/directive/ngEventDirs.js
index ed8ddd6ba167..4b1088c6d89f 100644
--- a/src/ng/directive/ngEventDirs.js
+++ b/src/ng/directive/ngEventDirs.js
@@ -43,6 +43,7 @@ forEach(
var directiveName = directiveNormalize('ng-' + name);
ngEventDirectives[directiveName] = ['$parse', function($parse) {
return {
+ restrict: 'A',
compile: function($element, attr) {
var fn = $parse(attr[directiveName]);
return function ngEventHandler(scope, element) {
diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js
index 5807311a3769..2db6671ee6f8 100644
--- a/src/ng/directive/ngRepeat.js
+++ b/src/ng/directive/ngRepeat.js
@@ -212,6 +212,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
var NG_REMOVED = '$$NG_REMOVED';
var ngRepeatMinErr = minErr('ngRepeat');
return {
+ restrict: 'A',
multiElement: true,
transclude: 'element',
priority: 1000,
diff --git a/src/ng/directive/ngShowHide.js b/src/ng/directive/ngShowHide.js
index a327843bb23f..3513b78e40d2 100644
--- a/src/ng/directive/ngShowHide.js
+++ b/src/ng/directive/ngShowHide.js
@@ -157,6 +157,7 @@
*/
var ngShowDirective = ['$animate', function($animate) {
return {
+ restrict: 'A',
multiElement: true,
link: function(scope, element, attr) {
scope.$watch(attr.ngShow, function ngShowWatchAction(value){
@@ -311,6 +312,7 @@ var ngShowDirective = ['$animate', function($animate) {
*/
var ngHideDirective = ['$animate', function($animate) {
return {
+ restrict: 'A',
multiElement: true,
link: function(scope, element, attr) {
scope.$watch(attr.ngHide, function ngHideWatchAction(value){
diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js
index d9af96f91485..886aae20306a 100644
--- a/src/ng/directive/select.js
+++ b/src/ng/directive/select.js
@@ -135,7 +135,11 @@ var ngOptionsMinErr = minErr('ngOptions');
*/
-var ngOptionsDirective = valueFn({ terminal: true });
+var ngOptionsDirective = valueFn({
+ restrict: 'A',
+ terminal: true
+});
+
// jshint maxlen: false
var selectDirective = ['$compile', '$parse', function($compile, $parse) {
//000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index aedff6e4d795..fb5dc525ded6 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -255,14 +255,6 @@ describe('$compile', function() {
}));
- it('should allow directives in comments', inject(
- function($compile, $rootScope, log) {
- element = $compile('01
')($rootScope);
- expect(log).toEqual('angular');
- }
- ));
-
-
it('should receive scope, element, and attributes', function() {
var injector;
module(function() {
@@ -437,20 +429,21 @@ describe('$compile', function() {
describe('restrict', function() {
- it('should allow restriction of attributes', function() {
- module(function() {
- forEach({div:'E', attr:'A', clazz:'C', all:'EAC'}, function(restrict, name) {
- directive(name, function(log) {
+ it('should allow restriction of availability', function () {
+ module(function () {
+ forEach({div: 'E', attr: 'A', clazz: 'C', comment: 'M', all: 'EACM'},
+ function (restrict, name) {
+ directive(name, function (log) {
return {
restrict: restrict,
- compile: valueFn(function(scope, element, attr) {
+ compile: valueFn(function (scope, element, attr) {
log(name);
})
};
});
});
});
- inject(function($rootScope, $compile, log) {
+ inject(function ($rootScope, $compile, log) {
dealoc($compile('')($rootScope));
expect(log).toEqual('');
log.reset();
@@ -459,7 +452,7 @@ describe('$compile', function() {
expect(log).toEqual('div');
log.reset();
- dealoc($compile('')($rootScope));
+ dealoc($compile('')($rootScope));
expect(log).toEqual('');
log.reset();
@@ -475,8 +468,38 @@ describe('$compile', function() {
expect(log).toEqual('clazz');
log.reset();
- dealoc($compile('')($rootScope));
- expect(log).toEqual('all; all; all');
+ dealoc($compile('')($rootScope));
+ expect(log).toEqual('comment');
+ log.reset();
+
+ dealoc($compile('')($rootScope));
+ expect(log).toEqual('all; all; all; all');
+ });
+ });
+
+
+ it('should use EA rule as the default', function () {
+ module(function () {
+ directive('defaultDir', function (log) {
+ return {
+ compile: function () {
+ log('defaultDir');
+ }
+ };
+ });
+ });
+ inject(function ($rootScope, $compile, log) {
+ dealoc($compile('')($rootScope));
+ expect(log).toEqual('defaultDir');
+ log.reset();
+
+ dealoc($compile('')($rootScope));
+ expect(log).toEqual('defaultDir');
+ log.reset();
+
+ dealoc($compile('')($rootScope));
+ expect(log).toEqual('');
+ log.reset();
});
});
});