【问题标题】:Angular 2.0.2 - Error encountered resolving symbol values staticallyAngular 2.0.2 - 静态解析符号值时遇到错误
【发布时间】:2016-10-12 01:16:33
【问题描述】:

在运行 i18n 时,我还遇到了著名的错误“遇到静态解析符号值时出错。不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用,解析符号”。 我已经做了很多研究,而且我没有使用 lambda 函数。当我将以下导入语句添加到我的基本模块时会发生这种情况:

export const mapsConfig = new LazyMapsAPILoaderConfig();
mapsConfig.apiKey = 'xyz';
// ... below is in import list
BingMapsModule.forRoot(config),

我正在使用 ng2-bingmaps,我也为它做出了贡献:https://github.com/youjustgo/ng2-bingmaps

奇怪的是,ng2-bingmaps 中的 JS 代码是什么并不重要。如果我删除所有 .js 文件,我仍然会收到同样的错误!因此,它必须是 ng2-bingmaps core.d.ts 中的内容,如下所示:

/**
 * ng2-bingmaps - Angular 2 components for Bing Maps
 * @version v0.2.0
 * @link https://github.com/youjustgo/ng2-bingmaps
 * @license MIT
 */
import { ModuleWithProviders } from '@angular/core';
import { LazyMapsAPILoaderConfig } from './services/maps-api-loader/lazy-maps-api-loader';
export * from './directives';
export * from './services';
export declare const NG2_BINGMAPS_PROVIDERS: any[];
/**
 * The ng2-bing-maps core module. Contains all Directives/Services/Pipes
 * of the core module. Please use `BingMapsModule.forRoot(config)` in your app module.
 *
 * @experimental
 */
export declare class BingMapsModule {
    static forRoot(config: LazyMapsAPILoaderConfig): ModuleWithProviders;
}

当我只导入 BingMapsModule(没有 forRoot)时,它可以工作。

我检查了 ng2-bingmaps 中的所有提供程序,它们都没有在装饰器中具有 lambda 函数。

我的基本模块定义:

@NgModule({
  imports: [ 
    // browser module, required to load in browser
    BrowserModule, 
    // routing
    RouterModule.forRoot(routes),
    // angular forms
    FormsModule,
    // ng2-bingmaps
    BingMapsModule.forRoot(mapsConfig),
    // ng-bootstrap
    NgbModule,
    // http
    HttpModule,

    // Angulartics2
    // Angulartics2Module.forRoot(),
    // our custom modules for certain parts of our app
    CreateBookingModule,
    CommonModule
  ],
  declarations: [ 
    // all our components
   ],
  bootstrap:    [ ClientApp ],
  providers: [ 
    // our services
    ]
})

【问题讨论】:

  • 显示更多基本模块。很难很好地了解您如何在上下文中使用 BingMapsModule

标签: javascript angular typescript


【解决方案1】:

“静态解析符号值时遇到错误。不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用,解析符号”

虽然我从未见过这个错误,但听起来它指的是这个

export const mapsConfig = new LazyMapsAPILoaderConfig();

如果mapsConfig 与您使用它的模块在同一个文件中,则不需要导出它。我想删除 export 应该可以解决错误。

另一件事,您可能不需要创建配置的实例。由于 TypeScript 的结构类型系统,您可以只使用对象字面量

BingMapsModule.forRoot({
  apiKey: 'xyz'
})

通常对于“配置”对象,无论如何您都会看到它的使用方式。

【讨论】:

  • 谢谢,最初我没有导出常量,只是尝试一下:) 我已经解决了,部分解决方案确实是使用对象文字。另一部分是 ng2-bingmaps 缺少所需的 .metadata.json 文件...
【解决方案2】:

最后我已经解决了,感谢@peeskillet 的回答。

  1. 使用对象文字而不是配置对象。
  2. ng2-bingmaps 不包含所需的 *.metadata.json 文件;每个 .d.ts 文件显然都需要这个。

【讨论】:

  • 您好 Boland,我遇到了与我为后端服务编写的库相同的问题。您能否详细说明 *.metadata.json 文件的含义以及如何创建它们?非常感谢!!!
  • @HanChe 你只需要运行 Angular2 AOT 编译器。它将生成这些文件:angular.io/docs/ts/latest/cookbook/aot-compiler.html#!#compile
  • 所以基本上除了运行 tsc 之外,您还运行 ngc 来生成这些文件并将它们一起推送到 npm?
  • 是的,先运行 ngc,然后 tsc :)
【解决方案3】:

在使用带有 Angular-cli 的 redux reducer 时遇到了类似的问题。 通过将函数导出并包装在app模块中的另一个函数中来解决它,然后使用导出的函数:

export function returnMainReducer(){
  return {mainReducer};
}

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    CoreModule,
    SharedModule,
    StoreModule.forRoot(returnMainReducer())
  ]

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2023-03-12
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多