11import { IS_DART , Type , Json , isBlank , stringify } from 'angular2/src/facade/lang' ;
22import { BaseException } from 'angular2/src/facade/exceptions' ;
3- import { ListWrapper , SetWrapper } from 'angular2/src/facade/collection' ;
3+ import { ListWrapper , SetWrapper , MapWrapper } from 'angular2/src/facade/collection' ;
44import { PromiseWrapper , Promise } from 'angular2/src/facade/async' ;
55import {
66 CompiledComponentTemplate ,
@@ -96,6 +96,7 @@ export class TemplateCompiler {
9696 private _compileComponentRuntime (
9797 cacheKey : any , compMeta : CompileDirectiveMetadata , viewDirectives : CompileDirectiveMetadata [ ] ,
9898 compilingComponentCacheKeys : Set < any > ) : CompiledComponentTemplate {
99+ let uniqViewDirectives = removeDuplicates ( viewDirectives ) ;
99100 var compiledTemplate = this . _compiledTemplateCache . get ( cacheKey ) ;
100101 var done = this . _compiledTemplateDone . get ( cacheKey ) ;
101102 if ( isBlank ( compiledTemplate ) ) {
@@ -109,7 +110,7 @@ export class TemplateCompiler {
109110 compilingComponentCacheKeys . add ( cacheKey ) ;
110111 done = PromiseWrapper
111112 . all ( [ < any > this . _styleCompiler . compileComponentRuntime ( compMeta . template ) ] . concat (
112- viewDirectives . map ( dirMeta => this . normalizeDirectiveMetadata ( dirMeta ) ) ) )
113+ uniqViewDirectives . map ( dirMeta => this . normalizeDirectiveMetadata ( dirMeta ) ) ) )
113114 . then ( ( stylesAndNormalizedViewDirMetas : any [ ] ) => {
114115 var childPromises = [ ] ;
115116 var normalizedViewDirMetas = stylesAndNormalizedViewDirMetas . slice ( 1 ) ;
@@ -175,9 +176,9 @@ export class TemplateCompiler {
175176 var compMeta = < CompileDirectiveMetadata > componentWithDirs . component ;
176177 assertComponent ( compMeta ) ;
177178 componentMetas . push ( compMeta ) ;
178- this . _processTemplateCodeGen ( compMeta ,
179- < CompileDirectiveMetadata [ ] > componentWithDirs . directives ,
180- declarations , templateArguments ) ;
179+
180+ this . _processTemplateCodeGen ( compMeta , componentWithDirs . directives , declarations ,
181+ templateArguments ) ;
181182 if ( compMeta . dynamicLoadable ) {
182183 var hostMeta = createHostComponentMeta ( compMeta . type , compMeta . selector ) ;
183184 componentMetas . push ( hostMeta ) ;
@@ -212,9 +213,10 @@ export class TemplateCompiler {
212213 private _processTemplateCodeGen ( compMeta : CompileDirectiveMetadata ,
213214 directives : CompileDirectiveMetadata [ ] ,
214215 targetDeclarations : string [ ] , targetTemplateArguments : any [ ] [ ] ) {
216+ let uniqueDirectives = removeDuplicates ( directives ) ;
215217 var styleExpr = this . _styleCompiler . compileComponentCodeGen ( compMeta . template ) ;
216- var parsedTemplate =
217- this . _templateParser . parse ( compMeta . template . template , directives , compMeta . type . name ) ;
218+ var parsedTemplate = this . _templateParser . parse ( compMeta . template . template , uniqueDirectives ,
219+ compMeta . type . name ) ;
218220 var changeDetectorsExprs = this . _cdCompiler . compileComponentCodeGen (
219221 compMeta . type , compMeta . changeDetection , parsedTemplate ) ;
220222 var commandsExpr = this . _commandCompiler . compileComponentCodeGen (
@@ -263,3 +265,17 @@ function addAll(source: any[], target: any[]) {
263265function codeGenComponentTemplateFactory ( nestedCompType : CompileDirectiveMetadata ) : string {
264266 return `${ moduleRef ( templateModuleUrl ( nestedCompType . type . moduleUrl ) ) } ${ templateGetterName ( nestedCompType . type ) } ` ;
265267}
268+
269+ function removeDuplicates ( items : CompileDirectiveMetadata [ ] ) : CompileDirectiveMetadata [ ] {
270+ let res = [ ] ;
271+ items . forEach ( item => {
272+ let hasMatch =
273+ res . filter ( r => r . type . name == item . type . name && r . type . moduleUrl == item . type . moduleUrl &&
274+ r . type . runtime == item . type . runtime )
275+ . length > 0 ;
276+ if ( ! hasMatch ) {
277+ res . push ( item ) ;
278+ }
279+ } ) ;
280+ return res ;
281+ }
0 commit comments