繁体   English   中英

如何在Angular 5组件中注入AngularJS服务?

[英]How do I inject an AngularJS service in an Angular 5 component?

我正在使用ngUpgrade将AngularJS项目迁移到Angular 5,但是在尝试将AngularJS服务注入到我的一个新组件中时遇到了问题。

我遵循了Angular的升级指南,并创建了一个使用$injector的serviceProvider(请参见下面的代码),但是我一直收到此错误:

core.js:1449错误错误:未被捕获(承诺):错误:尝试在设置AngularJS注入器之前获取它。

我怀疑我需要在某个地方使用forwardRef来解决此问题,但是我无法找到方法和位置(以及原因)。


按照升级指南的示例,我创建了一个serviceProvider,如下所示:

ajs-upgradeed-providers.ts:

// The AngularJS service I want to use
import { AuthenticationService } from '../ajs/services/authentication.service';

export function authenticationServiceFactory($injector) {
    return $injector.get('authentication');
}

export const authenticationServiceProvider = {
    provide: AuthenticationService,
    useFactory: authenticationServiceFactory,
    deps: ['$injector']
};

然后,将其提供给应用程序的NgModule:

app.module.ts:

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        UpgradeModule,
    ],
    providers: [
        authenticationServiceProvider,
    ],
    bootstrap: [
        AppComponent,
    ],
})
export class AppModule {
}

我使用ngUpgrade引导该模块:

主要

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

// Import our AngularJS module
import '../ajs/app';

platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .then(platformRef => {
        // Use the upgrade module to bootstrap the hybrid
        const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
        upgrade.bootstrap(document.documentElement, ['myAngularJSApp']);
    });

如果我理解正确,这应该允许我将AngularJS服务直接注入到组件中,如下所示:

login.component.ts

import { Component } from '@angular/core';

import { AuthenticationService } from '../ajs/services/authentication.service';

@Component({
    selector: 'my-login-page',
    templateUrl: './login-page.component.html'
})
export class LoginPageComponent {    
    constructor(private authenticationService: AuthenticationService) {
        console.log('authentication', authenticationService);
    }
}

我可以做些什么来进一步简化吗? 我试图尽可能严格地遵循升级指南,那为什么不起作用?

您需要添加

providers: [AuthenticationService] 

在组件声明中,如下所示:

import { Component } from '@angular/core';

import { AuthenticationService } from '../ajs/services/authentication.service';
@Component({
    selector: 'my-login-page',
    templateUrl: './login-page.component.html',
    providers: [AuthenticationService] 
})
export class LoginPageComponent {    
    constructor(private authenticationService: AuthenticationService) {
        console.log('authentication', authenticationService);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM