为AoT编译进行标记

时间:2017-06-08 10:03:00

标签: angular token aot

我遇到了JIT and AoT compilers之间不一致的问题。困扰我的最新错误是Error: Can't resolve all parameters for IndexedDBCache。 IndexedDBCache是​​一项依赖于string参数的服务:

请注意,当我删除'protected'属性时,也会出现此问题!

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

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

我正在使用工厂提供服务版本:

// 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
};

注意:这些文件必须根据func-in-providers-useFactoryarrow-function-exports进行拆分 - 不要问我为什么= /

现在AoT编译器根本不喜欢这个string参数。我已经调查了这个问题,但只能找到对OpaqueToken的引用(现在已经被InjectionToken<string>删除并取而代之)。我的代码现在是:

// 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); }

显然这不是编译,因为构造函数只允许string参数。我对ShotTokens或手头的AoT问题没有足够的了解来解决这个问题 - 任何人都有建议可以使用吗?

有关我的代码和问题的更多背景信息,请访问angular/angular#17295

我尝试过的事情:

  1. 删除protected访问修饰符&gt; 完全相同的错误仍然存​​在
  2. 删除字符串参数&gt; 不是选项 - 它定义了服务
  3. 使用InjectionToken<string>&gt;替换工厂中的字符串参数 InjectionToken不是合适的参数

1 个答案:

答案 0 :(得分:2)

对手头的问题存在误解。要分解的类不是服务本身,因此不需要@Injectable属性。更多细节可在Creating AoT compatible Service Factories

找到