简体   繁体   中英

Angular 2 DI error

Somehow DI is failing to instantiate a service for me. I am getting error TS2339: Property 'authenticationService' does not exist on type 'LoginComponent' .

How do I properly instantiate the AuthenticationService? I thought that mentioning it in app.module.ts in providers would take care of that.

Thanks in advance

Here is the AuthenticationService.ts:

import { Injectable } from '@angular/core';
import { /*HTTP_PROVIDERS, */Http, Headers } from '@angular/http';
import { AuthHttp } from 'angular2-jwt';

@Injectable()
export class AuthenticationService {

    jwtToken: any;

    constructor(public authHttp: AuthHttp) { }

    jwtHeader = new Headers({
        "Content-Type": "application/json",
        "alg": "HS256",
        "typ": "JWT"
    });


    Login(username: string, password: string) {

        console.log("from authService: " + username);

        this.authHttp.post('/api/AuthResponse',
            JSON.stringify({
                "username:": username,
                "password:": password
            }),
            { headers: this.jwtHeader }
        ).subscribe(data => this.jwtToken = data,
            () => console.log(this.jwtToken));

        return this.jwtToken;
    }

}

Here is the LoginComponent.ts:

import { Component, OnInit } from '@angular/core';
import { AuthenticationService } from './../../services/AuthenticationService';
import { AuthHttp, AuthConfig/*, AUTH_PROVIDERS, provideAuth*/ } from 'angular2-jwt';

@Component({
    selector: 'login',
    template: require('./login.component.html')
})
export class LoginComponent implements OnInit {
    username;
    password;

    constructor(authenticationService: AuthenticationService){}

    ngOnInit() {
        // reset login status
        //this.authenticationService.logout();

    }

    //private authService: AuthenticationService = new AuthenticationService(new AuthHttp(new AuthConfig(), new Http());

    login()
    {
        console.log(this.username);
        console.log(this.password);
        this.authenticationService.Login(this.username, this.password);
    }
}

app.module.ts

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { UniversalModule } from 'angular2-universal';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AuthHttp, AuthConfig, AUTH_PROVIDERS, provideAuth } from 'angular2-jwt';

import { AuthenticationService } from './services/AuthenticationService';

import { AppComponent } from './components/app/app.component'
import { NavMenuComponent } from './components/navmenu/navmenu.component';
import { HomeComponent } from './components/home/home.component';
import { FetchDataComponent } from './components/fetchdata/fetchdata.component';
import { CounterComponent } from './components/counter/counter.component';
import { LoginComponent } from './components/login/login.component';


@NgModule({

    declarations: [
        AppComponent,
        NavMenuComponent,
        CounterComponent,
        FetchDataComponent,
        HomeComponent,
        LoginComponent
    ],
    imports: [
        UniversalModule, // Must be first import. This automatically imports BrowserModule, HttpModule, and JsonpModule too.
        FormsModule,
        HttpModule,
        RouterModule.forRoot([
            { path: '', redirectTo: 'home', pathMatch: 'full' },
            { path: 'home', component: HomeComponent },
            { path: 'counter', component: CounterComponent },
            { path: 'fetch-data', component: FetchDataComponent },
            { path: 'login', component: LoginComponent },
            { path: '**', redirectTo: 'home' }
        ])
    ],
    providers: [
        AuthHttp,
        provideAuth({
            headerName: 'Authorization',
            headerPrefix: 'bearer',
            tokenName: 'token',
            tokenGetter: (() => localStorage.getItem('id_token')),
            globalHeaders: [{ 'Content-Type': 'application/json' }],
            noJwtError: true
        }),
        AuthenticationService
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

Change the constructor like this:

constructor(private authenticationService: AuthenticationService){}

so that you can access the authenticationService outside of the constructor with this

Note: You can also use constructor(public authenticationService: AuthenticationService){} the injections just need a public / private identifier to be accessed with this

if you trying to one module provider in another one then you should mention in in your routing file

like you are trying "ABC" in "XYZ" then in XYZ routing class

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
  providers: [ABC_provider]
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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