diff --git a/src/ng/compile.js b/src/ng/compile.js
index 02cd0bdbaa94..4baeff6ca75d 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -1029,17 +1029,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
}
if (isObject(bindings.bindToController)) {
var controller = directive.controller;
- var controllerAs = directive.controllerAs;
if (!controller) {
// There is no controller, there may or may not be a controllerAs property
throw $compileMinErr('noctrl',
'Cannot bind to controller without directive \'{0}\'s controller.',
directiveName);
- } else if (!identifierForController(controller, controllerAs)) {
- // There is a controller, but no identifier or controllerAs property
- throw $compileMinErr('noident',
- 'Cannot bind to controller without identifier for directive \'{0}\'.',
- directiveName);
}
}
return bindings;
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index e4a8ddf4e960..9c86cf021a23 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -5833,10 +5833,397 @@ describe('$compile', function() {
'foo': 'bar',
'baz': 'biz'
};
- element = $compile('
')($rootScope);
- expect(controllerCalled).toBe(true);
+ expect(this.str).toBe('Hello, world!');
+ expect(this.fn()).toBe('called!');
+ controllerCalled = true;
+ },
+ controllerAs: 'test',
+ bindToController: true
+ }));
+ });
+ inject(function($compile, $rootScope, $templateCache) {
+ $templateCache.put('test.html', 'isolate
');
+ $rootScope.fn = valueFn('called!');
+ $rootScope.whom = 'world';
+ $rootScope.remoteData = {
+ 'foo': 'bar',
+ 'baz': 'biz'
+ };
+ element = $compile('')($rootScope);
+ element = $compile('')($rootScope);
+ $rootScope.$digest();
+ expect(controllerCalled).toBe(true);
+ });
+ });
+
+
+ it('should throw noctrl when missing controller', function() {
+ module(function($compileProvider) {
+ $compileProvider.directive('noCtrl', valueFn({
+ templateUrl: 'test.html',
+ scope: {
+ 'data': '=dirData',
+ 'oneway': '')($rootScope);
+ }).toThrowMinErr('$compile', 'noctrl',
+ 'Cannot bind to controller without directive \'noCtrl\'s controller.');
+ });
+ });
+
+
+ it('should not throw noident when missing controllerAs directive property', function() {
+ module(function($compileProvider) {
+ $compileProvider.directive('noIdent', valueFn({
+ templateUrl: 'test.html',
+ scope: {
+ 'data': '=dirData',
+ 'oneway': '')($rootScope);
+ }).not.toThrow();
+ });
+ });
+
+
+ it('should not throw noident when missing controller identifier', function() {
+ module(function($compileProvider, $controllerProvider) {
+ $controllerProvider.register('myCtrl', function() {});
+ $compileProvider.directive('noIdent', valueFn({
+ templateUrl: 'test.html',
+ scope: {
+ 'data': '=dirData',
+ 'oneway': '')($rootScope);
+ }).not.toThrow();
+ });
+ });
+
+
+ it('should bind to controller via object notation (isolate scope)', function() {
+ var controllerCalled = false;
+ module(function($compileProvider, $controllerProvider) {
+ $controllerProvider.register('myCtrl', function() {
+ expect(this.data).toEqualData({
+ 'foo': 'bar',
+ 'baz': 'biz'
+ });
+ expect(this.oneway).toEqualData({
+ 'foo': 'bar',
+ 'baz': 'biz'
+ });
+ expect(this.str).toBe('Hello, world!');
+ expect(this.fn()).toBe('called!');
+ controllerCalled = true;
+ });
+ $compileProvider.directive('fooDir', valueFn({
+ templateUrl: 'test.html',
+ bindToController: {
+ 'data': '=dirData',
+ 'oneway': 'isolate');
+ $rootScope.fn = valueFn('called!');
+ $rootScope.whom = 'world';
+ $rootScope.remoteData = {
+ 'foo': 'bar',
+ 'baz': 'biz'
+ };
+ element = $compile('')($rootScope);
+ $rootScope.$digest();
+ expect(controllerCalled).toBe(true);
+ });
+ });
+
+
+ it('should bind to controller via object notation (new scope)', function() {
+ var controllerCalled = false;
+ module(function($compileProvider, $controllerProvider) {
+ $controllerProvider.register('myCtrl', function() {
+ expect(this.data).toEqualData({
+ 'foo': 'bar',
+ 'baz': 'biz'
+ });
+ expect(this.data).toEqualData({
+ 'foo': 'bar',
+ 'baz': 'biz'
+ });
+ expect(this.str).toBe('Hello, world!');
+ expect(this.fn()).toBe('called!');
+ controllerCalled = true;
+ });
+ $compileProvider.directive('fooDir', valueFn({
+ templateUrl: 'test.html',
+ bindToController: {
+ 'data': '=dirData',
+ 'oneway': 'isolate');
+ $rootScope.fn = valueFn('called!');
+ $rootScope.whom = 'world';
+ $rootScope.remoteData = {
+ 'foo': 'bar',
+ 'baz': 'biz'
+ };
+ element = $compile('')($rootScope);
+ $rootScope.$digest();
+ expect(controllerCalled).toBe(true);
+ });
+ });
+
+
+ it('should bind to multiple directives controllers via object notation (no scope)', function() {
+ var controller1Called = false;
+ var controller2Called = false;
+ module(function($compileProvider, $controllerProvider) {
+ $compileProvider.directive('foo', valueFn({
+ bindToController: {
+ 'data': '=fooData',
+ 'oneway': ' ' +
+ '')($rootScope);
+ $rootScope.$digest();
+ expect(controller1Called).toBe(true);
+ expect(controller2Called).toBe(true);
+ });
+ });
+
+
+ it('should bind to multiple directives controllers via object notation (new iso scope)', function() {
+ var controller1Called = false;
+ var controller2Called = false;
+ module(function($compileProvider, $controllerProvider) {
+ $compileProvider.directive('foo', valueFn({
+ bindToController: {
+ 'data': '=fooData',
+ 'oneway': ' ' +
+ '')($rootScope);
+ $rootScope.$digest();
+ expect(controller1Called).toBe(true);
+ expect(controller2Called).toBe(true);
+ });
+ });
+
+
+ it('should bind to multiple directives controllers via object notation (new scope)', function() {
+ var controller1Called = false;
+ var controller2Called = false;
+ module(function($compileProvider, $controllerProvider) {
+ $compileProvider.directive('foo', valueFn({
+ bindToController: {
+ 'data': '=fooData',
+ 'oneway': ' ' +
+ '')($rootScope);
+ $rootScope.$digest();
+ expect(controller1Called).toBe(true);
+ expect(controller2Called).toBe(true);
+ });
+ });
+
+
+ it('should evaluate against the correct scope, when using `bindToController` (new scope)',
+ function() {
+ module(function($compileProvider, $controllerProvider) {
+ $controllerProvider.register({
+ 'ParentCtrl': function() {
+ this.value1 = 'parent1';
+ this.value2 = 'parent2';
+ this.value3 = function() { return 'parent3'; };
+ this.value4 = 'parent4';
+ },
+ 'ChildCtrl': function() {
+ this.value1 = 'child1';
+ this.value2 = 'child2';
+ this.value3 = function() { return 'child3'; };
+ this.value4 = 'child4';
+ }
});
});