ng2-translate:TranslateService 和错误:无法读取未定义的属性“getOptional”(…)

Posted

技术标签:

【中文标题】ng2-translate:TranslateService 和错误:无法读取未定义的属性“getOptional”(…)【英文标题】:ng2-translate: TranslateService and Error: Cannot read property 'getOptional' of undefined(…) 【发布时间】:2016-06-13 04:50:10 【问题描述】:

我正在将 ng2-translate 添加到项目中。当我添加 TranslateService 时,我得到:

错误:无法读取 undefined(...) 的属性“getOptional”

我的系统配置设置正确,但经过数小时的搜索,我找不到任何可以帮助我找出问题所在的东西。

//angular
import bootstrap from "angular2/platform/browser";
import Component,Inject,provide from "angular2/core";
import HTTP_PROVIDERS from "angular2/http";
import TranslateService,TranslateStaticLoader,TranslateLoader from "ng2-translate/ng2-translate";

@Component(
    selector: 'app',
    directives: [TheApp],
    template: '<the-app></the-app>'
)

class TT
    translate:TranslateService
    constructor(@Inject(TranslateService) translate:TranslateService)
        this.translate = translate;
        ....
    
    ....


bootstrap(TT,[
    HTTP_PROVIDERS,
    provide(TranslateLoader, useClass: TranslateStaticLoader),
    TranslateService
]);

angular2.dev.js:353 TypeError: 无法读取未定义的属性“toString” angular2-polyfills.js:1243

错误:无法读取 undefined(...)Zone.run @ angular2-polyfills.js:1243zoneBoundFn @ angular2-polyfills.js:1220lib$es6$promise$$internal$$tryCatch @ angular2-polyfills 的属性“getOptional”。 js:468lib$es6$promise$$internal$$invokeCallback @ angular2-polyfills.js:480lib$es6$promise$$internal$$publish @ angular2-polyfills.js:451lib$es6$promise$$internal$$publishRejection @ angular2-polyfills.js:401(匿名函数) @ angular2-polyfills.js:123Zone.run @ angular2-polyfills.js:1243zoneBoundFn @ angular2-polyfills.js:1220lib$es6$promise$asap$$flush @ angular2-polyfills .js:262

<script src="es6-shim.min.js"></script>
    <script src="es6-module-loader.js"></script>
    <script src="system-polyfills.js"></script>

    <script src="angular2-polyfills.js"></script>
    <script src="system.src.js"></script>
    <script src="Rx.js"></script>
    <script src="angular2.dev.js"></script>
    <script src="ng2-bootstrap.js"></script>
    <script src="ng2-translate.js"></script>
    <script src="router.js"></script>
    <script src="http.js"></script>

<script>
            System.transpiler = 'typescript';
            System.config(
                packages: 
                    ts: 
                        format: 'register',
                        defaultExtension: 'js'
                    
                ,
                map: 
                    moment: '/moment.js',
                    'ng2-translate/ng2-translate': '/ng2-translate.js'
                
            );
            System.import('ts/main')
                    .then(null, console.error.bind(console));
        </script>

TypeError:无法读取未定义的属性“getOptional” 在 PlatformRef 上运行AppInitializers (localhost:8000/angular2.dev.js:12628:25)initApp (本地主机:8000/angular2.dev.js:12603:21)在 PlatformRef.application (本地主机:8000/angular2.dev.js:12550:22)在 Object.bootstrap (localhost:8000/angular2.dev.js:24805:64) 在执行 (localhost:8000/ts/main.js:118:23) 在 ensureEvaluated (localhost:8000/system.src.js:3197:26) 在 Object.execute (localhost:8000/system.src.js:3315:13) 在 doDynamicExecute (本地主机:8000/system.src.js:708:25)在链接 (localhost:8000/system.src.js:910:20) 在 doLink (localhost:8000/system.src.js:562:7)

【问题讨论】:

您的导入是否可能无法正常工作? 错误发生在哪里?你能添加错误消息/堆栈跟踪吗? 我猜你需要提供更多信息,最好是一个允许重现问题的 Plunker。 【参考方案1】:

我认为你的问题可能是:

您忘记在 html 文件中包含库的相应 JS 文件。

如果您依赖库的 TypeScript 文件,您忘记在 SystemJS 配置中定义映射条目

System.config(
  map: 
    'ng2-translate': 'node_modules/ng2-translate'
  ,
  (…)
);

编辑

我终于用下面的配置让它工作了:

<script src="https://code.angularjs.org/2.0.0-beta.7/angular2-polyfills.js"></script>
<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.7/Rx.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.7/angular2.dev.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.7/http.dev.js"></script>

<script>
  System.config(
    map: 
      "ng2-translate": "node_modules/ng2-translate"
    ,
    packages:       
      app: 
        format: 'register',
        defaultExtension: 'js'
      ,
      "ng2-translate": 
        "defaultExtension": "js"
      
    ,
  );
  System.import('app/boot')
        .then(null, console.error.bind(console));
</script>

这是我的 boot.ts 文件中的内容:

import  bootstrap  from 'angular2/platform/browser';
import  provide  from 'angular2/core';
import  HTTP_PROVIDERS  from 'angular2/http';
import  AppComponent  from './app.component';
import TranslateService,TranslateStaticLoader,TranslateLoader from "ng2-translate/ng2-translate";

bootstrap(AppComponent, [
  HTTP_PROVIDERS,
  provide(TranslateLoader, useClass: TranslateStaticLoader),
  TranslateService
]);

不要忘记指定HTTP_PROVIDERS,因为它是 ng2-translate 的要求...

通过这种配置,我可以将TranslateService 实例注入到组件中:

import Component,Inject from 'angular2/core';
import TranslateService,TranslateStaticLoader,TranslateLoader from "ng2-translate/ng2-translate";

@Component(
  selector: 'first-app',
  template: `
    <div>Hello wolrd</div>  
  `
)
export class AppComponent 
  constructor(translate:TranslateService) 
    console.log(translate); // not undefined
  

【讨论】:

我认为问题出在这个级别。您能否在问题中添加 HTML 条目文件的内容? 谢谢!您可以尝试删除 ng2-translate 的地图条目吗? 您可以尝试在 angular2-polyfills.js 文件的第 1243 行放置一个断点,以了解发生错误时的本地上下文... 获取意外令牌 完整错误见上文,不确定是否有帮助,但有很多事情可以有效地在那里添加断点

以上是关于ng2-translate:TranslateService 和错误:无法读取未定义的属性“getOptional”(…)的主要内容,如果未能解决你的问题,请参考以下文章

ionic3-ng4学习见闻--(多语言方案)

选择新语言时,ngx quill 占位符不会改变

如何更新 .json 文件而不在 Angular cli 中重建?

在Jasmine Unit Test中为PhantomJS配置浏览器语言

从 Angular Universal 应用程序中的 Express JS 获取值

ionic2 基于ngx-translate实现多语言切换,翻译