【问题标题】:Angular4 provider into angularJS app has providerAngular4 提供程序到 angularJS 应用程序有提供程序
【发布时间】:2019-01-30 13:48:13
【问题描述】:

我在 angularjs 中有一个应用程序,它被移植到 angular4。

我想在 angular4 中创建一个提供程序,并将其注入到 angularJS 的 app.config 中。

现在,我有以下内容

import { UtilsService } from './../utils/utils.service';
import { Injectable, Inject } from '@angular/core';
import { downgradeInjectable } from '@angular/upgrade/static';


import { TranslateService } from '@ngx-translate/core';
import { ENGLISH } from '../../../../../languages/locale-en';
import { JAPANESE } from '../../../../../languages/locale-ja';


declare const angular: angular.IAngularStatic;

// USED to setup translation for angular4 from angularjs

@Injectable()
export class Angular4TranslateProvider{
    constructor(@Inject(TranslateService) public _translate: TranslateService) {}

    SetupAngular4Translation(){
        this._translate.setDefaultLang(UtilsService.DefaultLanguage());
        this._translate.use(UtilsService.DefaultLanguage());


        this._translate.setTranslation('en', ENGLISH );
        this._translate.setTranslation('jp', JAPANESE );
    }

    Use(lg:string){
        this._translate.use(lg);
    }

}


angular.module('b-eee').factory('angular4TranslateProvider', downgradeInjectable(Angular4TranslateProvider));

它被添加到 App.Module 中:

providers: [

        Angular4TranslateProvider
    ],

我试图在我的 app.config 中调用它:

import { app } from './main';

(function() {
    'use strict';

    app.value('$routerRootComponent', 'app')

    app.config(["$routeProvider"
        , "angular4TranslateProvider"
        , function(
        $routeProvider
        , angular4TranslateProvider
        ) {

但我在页面加载时出错:

错误:[$injector:unpr] 未知提供者:angular4TranslateProvider。

我怎样才能让它工作?

抱歉,plunker 的演示很复杂

编辑:提供程序在我的 angularJS 应用程序中无处不在,但我想通过它在 app.config.js 中有提供程序,因此是应用程序的主要组件。只有在那里它才会返回 undefined。

【问题讨论】:

  • 为什么要将 AngularJS 与 Angular 混合使用?我担心它会起作用吗?
  • 您是否将Angular4TranslateProvider 添加到您的app.module 文件的providers 数组中?
  • @diecho 因为我正在 angular4 中升级 angularjs 应用程序。我的应用是混合的,我需要它。
  • @royson 是的,我在所有模块中都添加了。我可以从 app.config 中访问它,但在创建时没有提供者。

标签: angularjs angular


【解决方案1】:

我没有看到您在 ngModule 中注册提供程序。还有一段你应该有的代码,即

 import { Angular4TranslateProvider} from './Angular4TranslateProvider';

 @NgModule({
    imports: [
     BrowserModule,
     UpgradeModule
 ],
 providers: [ Heroes ]
})
export class AppModule {
    constructor(private upgrade: UpgradeModule) { }
    ngDoBootstrap() {
      this.upgrade.bootstrap(document.body, ['b-eee'], { strictDi: true });
    }
}

现在在您的 angularJS 中,将 Angular 服务转换为 angularJS 工厂函数并在 angularJS 模块中使用它。

import { Angular4TranslateProvider} from './Angular4TranslateProvider';
/* . . . */
import { downgradeInjectable } from '@angular/upgrade/static';

angular.module('b-eee', [])
    .factory('angular4TranslateProvider', downgradeInjectable(Angular4TranslateProvider))
    .component('component', Component);

组件将是您要使用提供程序的组件。我以前用过类似的东西,它奏效了。你可以参考这个特定的文档:

Angular documentation for making angular dependencies injectable in AngularJS

【讨论】:

  • 我刚刚在你发帖前一秒编辑了那部分。抱歉,问题是,我的提供程序在 angularJS 应用程序中的每个地方都有效。但是不要在 angularjs 的 app.config.js 里面工作。如果我将他作为提供者注入这里,它将是未定义的。
  • 明白你的意思。那么,你能试试 angular.module('b-eee', []) .factory('angular4TranslateProvider', downgradeInjectable(Angular4TranslateProvider)) .config('configName', ConfigName);只需替换最后一行。
  • 我设法以另一种方式做到这一点,通过在应用程序内使用加载时调用的另一个组件,并且从该组件中,提供者没有未定义。稍后我会在上面的评论中尝试你的解决方案,我需要在开发中继续前进吗^^谢谢你的回复!
  • 很好地考虑了周围的工作!乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多