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:
- Entfernen der
protected
Zugriffsmodifikator>Exakt gleiche Fehler weiterhin - den String-Parameter Entfernen>Keine Option - es definiert den Dienst
- Ersetzen Sie den String-Parameter im Werk mit einem
InjectionToken<string>
>Ein InjectionToken ist nicht ein geeigneter Parameter
'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
@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
Wenn die Klasse nicht '@Injectable()' hat Angular wird nicht versuchen, es zu injizieren, dies ist die einzige Möglichkeit, die Sie den Konstruktor – Toxicable