Служба Angular 2 не вводится (RC-4)

0

Вот мой app.component.ts:

import { Component } from '@angular/core';
import { provideRouter, RouterConfig, Router, ROUTER_DIRECTIVES } from '@angular/router';
import { LoginComponent } from "./login/login.component";
import {LoginService} from "./login/login.service";

var ROUTES = [
    {
        path: '',
        redirectTo: '/login',
        terminal: true
    },
    {
        // useAsDefault: true,
        path: 'login',
        component: LoginComponent,
        showInNavbar: false
    }
];

export const appRoutes: RouterConfig = ROUTES;
export  const APP_ROUTER_PROVIDER = provideRouter(appRoutes);

@Component({
    selector: 'my-app',
    providers: [LoginService],
    directives: [LoginComponent],
    templateUrl: 'app/app.component.html'
})

export class AppComponent {
    routes = ROUTES;
    constructor (private router: Router, private loginService:LoginService){} 

    shouldIncludeFooter() {
        return !(this.router.url === '/home');
    }
}

И мой main.ts:

import { bootstrap } from '@angular/platform-browser-dynamic';
import { HTTP_PROVIDERS, BrowserXhr, XHRBackend } from '@angular/http';
import { Injectable } from '@angular/core';
import { AppComponent, APP_ROUTER_PROVIDER } from './app/app.component';
import {AuthenticationConnectionBackend} from "./app/AuthenticationConnectionBackend";

@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
    constructor() {
        super();
    }
    build(): any {
        let xhr = super.build();
        console.log(xhr);
        xhr.withCredentials = true;
        return <any>(xhr);
    }
}

bootstrap(AppComponent, [
    HTTP_PROVIDERS,
    APP_ROUTER_PROVIDER,
    { provide: BrowserXhr, useClass: CustomBrowserXhr },
    { provide: XHRBackend, useClass: AuthenticationConnectionBackend}
]);

У меня есть такая услуга:

import { Injectable}    from '@angular/core';
import { Headers, Http } from '@angular/http';

import {User} from "../shared/User";
import {Router} from "@angular/router";

@Injectable()
export class LoginService {

    constructor(private http: Http, private router:Router) {
        this.user = new User();
    }
}

И компонент, который должен вводить LoginService:

import { Component } from '@angular/core';
import {LoginInfo} from "./login-info";
import { Router } from '@angular/router';
import {LoginService} from "./login.service";
import {ConstantsService} from "../constants.service";

@Component({
    selector: 'login',
    templateUrl: 'app/login/login.component.html',
    styleUrls: ['app/login/login.component.css']
})
export class LoginComponent {
    loginInfo: LoginInfo = {
        username: "",
        password: ""
    };
    status: number = 0;

    constructor(private loginService: LoginService, private router: Router) { }

    logIn() {
        this.loginService.logIn(this.loginInfo)
            .then(status => this.success(status))
            .catch(error => this.status = error.status);
    }

    success(status: number) {
        this.status = status;
        this.router.navigate(['home']);
    }
}

Но я получаю эту ошибку в консоли браузера:

(index):27 Error: ReferenceError: LoginService is not defined

Когда я вхожу в источник, я получаю эту ошибку:

Error: ReferenceError: LoginService is not defined
at eval (http://localhost:3001/public/scripts/app/login/login.component.js:41:42)
at Object.eval (http://localhost:3001/public/scripts/app/login/login.component.js:44:3)
at eval (http://localhost:3001/public/scripts/app/login/login.component.js:47:4)
at eval (http://localhost:3001/public/scripts/app/login/login.component.js:48:3)
Evaluating http://localhost:3001/public/scripts/app/login/login.component.js
Evaluating http://localhost:3001/public/scripts/app/app.component.js
Evaluating http://localhost:3001/public/scripts/main.js
Error loading http://localhost:3001/public/scripts/main.js

Это работало до моего обновления до rc-4 (от rc-1) и нового маршрутизатора от @angular/router-deprecated, но я не могу точно определить, откуда эта проблема. Это должно быть проблемой инъекции зависимостей.

system.config.js

(function(global) {
    // map tells the System loader where to look for things
    var map = {
        'app':                        'public/scripts', // 'dist',
        '@angular':                   'node_modules/@angular',
        'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
        'rxjs':                       'node_modules/rxjs'
    };
    // packages tells the System loader how to load when no filename and/or no extension
    var packages = {
        'app':                        { main: 'main.js',  defaultExtension: 'js' },
        'rxjs':                       { defaultExtension: 'js' },
        'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' }
    };
    var ngPackageNames = [
        'common',
        'compiler',
        'core',
        'forms',
        'http',
        'platform-browser',
        'platform-browser-dynamic',
        'router',
        'router-deprecated',
        'upgrade'
    ];

    // Individual files (~300 requests):
    function packIndex(pkgName) {
        packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
    }
    // Bundled (~40 requests):
    function packUmd(pkgName) {
        packages['@angular/'+pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
    }
    // Most environments should use UMD; some (Karma) need the individual index files
    var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
    // Add package entries for angular packages
    ngPackageNames.forEach(setPackageConfig);


    // // Add package entries for angular packages
    // ngPackageNames.forEach(function(pkgName) {
    //     packages['@angular/'+pkgName] = { main: pkgName + '.umd.js', defaultExtension: 'js' };
    // });
    var config = {
        map: map,
        packages: packages
    };
    System.config(config);
})(this);
  • 0
    Не похоже, что у вас есть loginService, указанный в качестве поставщика в компоненте, который, как вы говорите, «должен внедрить LoginService» - вы должны иметь в поставщиках метаданных @component providers: [LoginService], как у вас в app.component
  • 0
    Я смущен. В предыдущих версиях вы предоставляете сервис только один раз, и, включив его в конструктор дочерних компонентов, вы можете получить к нему доступ (аналог одиночного).
Показать ещё 1 комментарий
Теги:
angular
dependency-injection
service
angular2-services

2 ответа

0
Лучший ответ

Я понял, что проблема в том, что я изменил часть кода с угловым сердечником. Это произошло во время рефакторинга в Webstorm. Я переименовал одну из моих служб и переименовал службу с тем же именем в Угловом коде. Я исправил его, удалив каталог node_modules и перезапустив npm install.

0

Я думаю, ошибка может быть здесь. Проверьте конструктор в app.component.

constructor (private router: Router, private loginService:LoginService,
  • 0
    Извините, я исправил это. Все еще сталкиваюсь с той же проблемой.
  • 1
    Вы используете загрузчик модулей SystemJS?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню