From d839757ef3602479d5e50bb74e5e25538536074f Mon Sep 17 00:00:00 2001 From: Martin Hochel Date: Sun, 10 Jan 2016 22:07:23 +0100 Subject: [PATCH] fix(directives/directive_provider): correctly assign controller do DDO --- src/core/di/provider.ts | 4 +-- src/core/directives/directive_provider.ts | 30 +++++++++++-------- test/core/di/povider.spec.ts | 5 ++++ .../directives/directive_provider.spec.ts | 4 +-- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/core/di/provider.ts b/src/core/di/provider.ts index be0b9e8..7c37004 100644 --- a/src/core/di/provider.ts +++ b/src/core/di/provider.ts @@ -84,11 +84,11 @@ class ProviderBuilder{ } if ( annotation instanceof PipeMetadata ) { - return pipeProvider.createFromType(injectableType); + return pipeProvider.createFromType( injectableType ); } if ( annotation instanceof DirectiveMetadata ) { - return directiveProvider.createFromType(injectableType); + return directiveProvider.createFromType( injectableType ); } if ( annotation instanceof InjectableMetadata ) { diff --git a/src/core/directives/directive_provider.ts b/src/core/directives/directive_provider.ts index 2703a3c..be578ad 100644 --- a/src/core/directives/directive_provider.ts +++ b/src/core/directives/directive_provider.ts @@ -45,34 +45,40 @@ export class DirectiveProvider { const {inputs,attrs,outputs,host,queries,legacy} = metadata; let _ddo = {} as ng.IDirective; + const _basicDDO = { + controller: type, + require: this._createRequires( requireMap, directiveName ), + } as ng.IDirective; + if ( metadata instanceof ComponentMetadata ) { - _ddo = { + const componentSpecificDDO = { scope: {}, bindToController: this._createComponentBindings( inputs, attrs, outputs ), - controller: Type, controllerAs: 'ctrl', - require: this._createRequires( requireMap, directiveName ), link: this._createLink( type, metadata, lfHooks, requireMap ) - }; + } as ng.IDirective; if ( metadata.template && metadata.templateUrl ) { throw new Error( 'cannot have both template and templateUrl' ); } if ( metadata.template ) { - _ddo.template = metadata.template; + componentSpecificDDO.template = metadata.template; } if ( metadata.templateUrl ) { - _ddo.templateUrl = metadata.templateUrl; + componentSpecificDDO.templateUrl = metadata.templateUrl; } - } - else { - _ddo = { - controller: Type, - require: this._createRequires( requireMap, directiveName ), + StringMapWrapper.assign( _ddo, _basicDDO, componentSpecificDDO ); + + } else { + + const directiveSpecificDDO = { link: this._createLink( type, metadata, lfHooks, requireMap ) - }; + } as ng.IDirective; + + StringMapWrapper.assign( _ddo, _basicDDO, directiveSpecificDDO ); + } const ddo = this._createDDO( _ddo, metadata.legacy ); diff --git a/test/core/di/povider.spec.ts b/test/core/di/povider.spec.ts index 5231313..c8d27de 100644 --- a/test/core/di/povider.spec.ts +++ b/test/core/di/povider.spec.ts @@ -86,6 +86,7 @@ describe( `di/provider`, ()=> { expect( FooPipe.$inject ).to.deep.equal( [ 'myService' ] ); } ); + it( `should return string name and directiveFactory for Angular registry and add $inject prop if needed (Directive)`, ()=> { class MyService{} @@ -102,9 +103,12 @@ describe( `di/provider`, ()=> { expect( ngContainerName ).to.deep.equal( 'myFoo' ); expect( isFunction( filterFactory ) ).to.deep.equal( true ); + expect(FooDirective.$inject).to.deep.equal(['myService']); + //expect( filterFactory().controller ).to.equal( FooDirective ); } ); + it( `should return string name and directiveFactory for Angular registry and add $inject prop if needed (Component)`, ()=> { class MyService{} @@ -124,6 +128,7 @@ describe( `di/provider`, ()=> { expect( isFunction( filterFactory ) ).to.deep.equal( true ); expect(FooComponent.$inject).to.deep.equal(['myService','$element']); + expect( filterFactory().controller ).to.equal( FooComponent ); } ); diff --git a/test/core/directives/directive_provider.spec.ts b/test/core/directives/directive_provider.spec.ts index 688aad6..08fab12 100644 --- a/test/core/directives/directive_provider.spec.ts +++ b/test/core/directives/directive_provider.spec.ts @@ -73,7 +73,7 @@ describe( `directives/directive_provider`, ()=> { expect( isFunction( directiveFactory ) ).to.equal( true ); expect( directiveFactory() ).to.deep.equal( { require: [ 'myClicker' ], - controller: MyClicker.constructor, + controller: MyClicker, link: { pre: (ddo.link as ng.IDirectivePrePost).pre, post: (ddo.link as ng.IDirectivePrePost).post @@ -209,7 +209,7 @@ describe( `directives/directive_provider`, ()=> { onLightsaberAttack: '&' }, require: [ 'jediMaster' ], - controller: JediMasterCmp.constructor, + controller: JediMasterCmp, controllerAs: 'ctrl', link: { pre: (ddo.link as ng.IDirectivePrePost).pre,