@@ -144,17 +144,20 @@ export function awaitCurrentlyCompilingComponents(): Promise<void> {
144144function directiveMetadata ( type : Type < any > , metadata : Directive ) : R3DirectiveMetadata {
145145 // Reflect inputs and outputs.
146146 const propMetadata = getReflect ( ) . propMetadata ( type ) ;
147- const inputs : StringMap = { } ;
148- const outputs : StringMap = { } ;
149147
150148 const host = extractHostBindings ( metadata , propMetadata ) ;
151149
150+ const inputsFromMetadata = parseInputOutputs ( metadata . inputs || [ ] ) ;
151+ const outputsFromMetadata = parseInputOutputs ( metadata . outputs || [ ] ) ;
152+
153+ const inputsFromType : StringMap = { } ;
154+ const outputsFromType : StringMap = { } ;
152155 for ( let field in propMetadata ) {
153156 propMetadata [ field ] . forEach ( ann => {
154157 if ( isInput ( ann ) ) {
155- inputs [ field ] = ann . bindingPropertyName || field ;
158+ inputsFromType [ field ] = ann . bindingPropertyName || field ;
156159 } else if ( isOutput ( ann ) ) {
157- outputs [ field ] = ann . bindingPropertyName || field ;
160+ outputsFromType [ field ] = ann . bindingPropertyName || field ;
158161 }
159162 } ) ;
160163 }
@@ -163,7 +166,9 @@ function directiveMetadata(type: Type<any>, metadata: Directive): R3DirectiveMet
163166 name : type . name ,
164167 type : new WrappedNodeExpr ( type ) ,
165168 selector : metadata . selector ! ,
166- deps : reflectDependencies ( type ) , host, inputs, outputs,
169+ deps : reflectDependencies ( type ) , host,
170+ inputs : { ...inputsFromMetadata , ...inputsFromType } ,
171+ outputs : { ...outputsFromMetadata , ...outputsFromType } ,
167172 queries : [ ] ,
168173 lifecycle : {
169174 usesOnChanges : type . prototype . ngOnChanges !== undefined ,
@@ -213,3 +218,13 @@ function isHostBinding(value: any): value is HostBinding {
213218function isHostListener ( value : any ) : value is HostListener {
214219 return value . ngMetadataName === 'HostListener' ;
215220}
221+
222+ function parseInputOutputs ( values : string [ ] ) : StringMap {
223+ return values . reduce (
224+ ( map , value ) => {
225+ const [ field , property ] = value . split ( ',' ) . map ( piece => piece . trim ( ) ) ;
226+ map [ field ] = property || field ;
227+ return map ;
228+ } ,
229+ { } as StringMap ) ;
230+ }
0 commit comments