2017-06-08 9 views
3

Ich habe einige Probleme mit den Inkonsistenzen zwischen JIT and AoT compilers. Der letzte Fehler, der mich überrascht hat, war Error: Can't resolve all parameters for IndexedDBCache. IndexedDBCache ist ein Dienst, der von einem string-Parameter abhängt:Tokenizing für AoT-Kompilierung

Bitte beachten Sie, dieses Problem tritt auch auf, wenn ich die 'geschützte' Eigenschaft entfernen!

// indexeddb-cache.ts 
import { Injectable } from '@angular/core'; 

@Injectable() 
export class IndexedDBCache { 
    constructor(protected databaseName : string) {} 
} 

Ich verwende eine Fabrik Versionen des Service zu bieten:

// test-api.cache.factory.ts 
import { IndexedDBCache } from '../indexeddb-cache/indexeddb-cache'; 

export function testIndexedDBCacheFactory() { return new IndexedDBCache('test'); } 

// test-api.cache.ts 
import { InjectionToken, Provider } from '@angular/core'; 
import { IndexedDBCache } from '../indexeddb-cache/indexeddb-cache'; 
import { testIndexedDBCacheFactory } from './test-api.cache.factory'; 

export const testIndexedDBCache = new InjectionToken<IndexedDBCache>('testIndexedDBCache'); 

export let testIndexedDBCacheProvider : Provider = { 
    provide: testIndexedDBCache, 
    useFactory: testIndexedDBCacheFactory 
}; 

Hinweis: Diese Dateien entsprechend aufgeteilt werden müssen func-in-providers-useFactory und arrow-function-exports - frag mich nicht why =/

Jetzt ist der AoT-Compiler überhaupt nicht so, string parameter. Ich habe das Problem untersucht, konnte aber nur einen Verweis auf OpaqueToken (jetzt entzogen und ersetzt durch InjectionToken<string>) finden. Mein Code würde jetzt lesen:

// test-api.cache.factory.ts 
import { InjectionToken } from '@angular/core'; 
import { IndexedDBCache } from '../indexeddb-cache/indexeddb-cache'; 

const testIndexedDBCacheFactoryToken = new InjectionToken<string>('test'); 
export function testIndexedDBCacheFactory() { return new IndexedDBCache(testIndexedDBCacheFactoryToken); } 

Offensichtlich ist dies nicht kompiliert als der Konstruktor nur für einen string Parameter erlauben würde. Ich habe nicht genug Wissen über InjectionTokens oder das AoT-Problem, um dieses Problem zu lösen - jeder hat einen Vorschlag für ein Konstrukt, das funktionieren würde?

Weitere Kontext auf meinem Code und Problem bei angular/angular#17295 gefunden werden.


Dinge, die ich habe versucht:

  1. Entfernen der protected Zugriffsmodifikator>Exakt gleiche Fehler weiterhin
  2. den String-Parameter Entfernen>Keine Option - es definiert den Dienst
  3. Ersetzen Sie den String-Parameter im Werk mit einem InjectionToken<string>>Ein InjectionToken ist nicht ein geeigneter Parameter
+0

'Konstruktor gefunden werden (geschützt database: string) {}' Sie kann dies tun, da diese Klasse als @Injectable Angular markiert werden versuchen, diese Zeichenfolge zu injizieren, in der es nicht – Toxicable

+0

@Toxicable es tun kann funktioniert gut, wenn JIT verwendet wird. Gibt es eine alternative Möglichkeit zum Einrichten von Service Factories auf Basis einer Zeichenfolge? – Raven

+0

Wenn die Klasse nicht '@Injectable()' hat Angular wird nicht versuchen, es zu injizieren, dies ist die einzige Möglichkeit, die Sie den Konstruktor – Toxicable

Antwort

2

Es gab ein Missverständnis des vorliegenden Problems. Die zu faktorisierenden Klassen sind keine Dienste selbst und benötigen als solche nicht die @Injectable Eigenschaft. Weitere Details zu Creating AoT compatible Service Factories

Verwandte Themen