2016-06-06 25 views
9

bootstrap(app, [providers]) yönteminde önyüklemeden sonra bile No Provider for FirebaseService hatası alıyorum. Özel bir hizmeti başka bir özel hizmete nasıl enjekte edersiniz?

Ben Pascal's guide for injecting a service within a service takip ettim HTTP_PROVIDERS bootstrapped ile Http hizmet enjekte edildiğinde işe yaradı, ama kendi hizmetine değiştirdikten sonra bir No providers for FirebaseService hata alırsınız.

FirebaseService numaralı iğnenin yalnızca iyi bir şekilde enjekte edilerek her iki sunucuyu da enjekte edebilirim. contructor(@Inject(FirebaseService) firebase: FirebaseService){} yapsam bile işe yaramaz, ancak benim anlayışım @Injectable() dekoratörünün eklenmesinin aynı etkiye sahip olması gerektiğidir.

giriş-page.ts

import {Component} from '@angular/core'; 
import {UserService} from '../../Services/user.service'; 
import {FirebaseService} from '../../services/firebase.service'; 
import { UserModel } from '../../export'; 


@Component({ 
    moduleId: 'app/PAGES/login-page/', 
    selector: 'login-page', 
    templateUrl: 'login-page.html', 
    styleUrls: ['login-page.css'], 
    providers: [ UserService] 
}) 
export class LoginPage { 
    constructor(private userService: UserService) {} 
    user:UserModel = new UserModel(); 
    hello: string = "You got yourself a login page, sir"; 

    dostuff() { 

     console.log(this.user); 
     // this.userService.createUser(this.user); 
    } 
} 

main.ts

import { bootstrap } from '@angular/platform-browser-dynamic'; 
import { AppComponent } from './app.component'; 
import { FirebaseService } from './SERVICES/firebase.service'; 

bootstrap(AppComponent, [ 
    FirebaseService 
]); 

UserService

import { Injectable, Inject } from '@angular/core'; 
import {FirebaseService} from './firebase.service'; 
import { UserModel } from '../export'; 

@Injectable() 
export class UserService { 

    constructor(private firebaseService: FirebaseService) {} 

    public createUser(user: UserModel): any { 
     console.log(user); 
    //  this.firebaseService.set(user) 
    } 

    public getUser(username: string): any { 
    //  return this.firebaseService.get("users/" + username); 
    } 
} 

FirebaseService

@Injectable() 
export class FirebaseService { 

    public get(path: string): any { 
     console.log(path); 
    } 

    public set(objectToSave: any) { 
     console.log(objectToSave); 
    } 
} 
+0

Başvuru için, tam depo burada: https://github.com/ChuckkNorris/Ng2RcTest –

cevap

4

Ben plunk yaptım ve bu kullanıcı hizmetine firebase hizmeti enjekte ve enjekte.

main.ts

import { bootstrap } from '@angular/platform-browser-dynamic'; 
import { App } from './app'; 
import { FirebaseService } from './firebase.service'; 

bootstrap(App, [ 
    FirebaseService 
]); 

//our root app component 
import {Component} from '@angular/core' 
import {UserService} from './user.service'; 

@Component({ 
    selector: 'my-app', 
    providers: [UserService], 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 

    </div> 
    `, 
    directives: [] 
}) 
export class App { 
    constructor(private userService: UserService) { 
    this.userService.createUser({h: 1}); 
    this.name = 'Angular2 (Release Candidate!)' 
    } 
} 

user.service.ts

import { Injectable, Inject } from '@angular/core'; 
import {FirebaseService} from './firebase.service'; 
import { UserModel } from '../export'; 

@Injectable() 
export class UserService { 

    constructor(private firebaseService: FirebaseService) {} 

    public createUser(user: UserModel): any { 
     console.log(this.firebaseService) 
     console.log(user); 
    //  this.firebaseService.set(user) 
    } 

    public getUser(username: string): any { 
    //  return this.firebaseService.get("users/" + username); 
    } 
} 

firebase.service.ts

import {Injectable} from '@angular/core' 
@Injectable() 
export class FirebaseService { 

    public get(path: string): any { 
     console.log(path); 
    } 

    public set(objectToSave: any) { 
     console.log(objectToSave); 
    } 
} 
app.ts

http://plnkr.co/edit/RLVT9dvfqH9W2BvE0qMG?p=preview

+5

Bu cevabın artık Angular2 rc6 – Dyna

+0

@ Dyna'dan geçerli olmadığını düşünüyorum, lütfen neden işaret edebilir misiniz? –

+3

@PavelSapehin Bu cevabın, modül kavramının tanıtılmasından önce yazılmasından kaynaklanmaktadır. Bunu yapmanın yeni yolu, yalnızca ilgili modülde (kök modül gibi) gerekli hizmetleri sağlamak ve uygulama boyunca bir tekli servis örneği mevcut olacaktır. –

0

Eğer main.ts yılında UserService ekleme değildir. de bu eklemeyi deneyin: UserService yüzden de ön yükleme yapılmış almak gerekiyor üzerinde

import { bootstrap } from '@angular/platform-browser-dynamic'; 
import { PLATFORM_DIRECTIVES, provide } from '@angular/core'; 
import { AppComponent } from './app.component'; 
import { ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router'; 
import { UxButton, UxText } from './export'; 
import { FirebaseService } from './SERVICES/firebase.service'; 
import { UserService } from './SERVICES/user.service'; 

bootstrap(AppComponent, [ 
    FirebaseService, 
    UserService  //<-- add this 
    ,ROUTER_DIRECTIVES 
    ,ROUTER_PROVIDERS 
    ,provide(PLATFORM_DIRECTIVES, {useValue: UxButton, multi: true}) 
    ,provide(PLATFORM_DIRECTIVES, {useValue: UxText, multi: true}) 
]); 

sizin login-page.ts sayfa bağlıdır.

+1

Bunu zaten hiç denemeden denedim. Yalnızca Firebase örneği için UserService için tekil bir örnek istemiyorum. Daha önce hiç sorun olmamıştı. –

1

İçe aktarma deyimi yollarının büyük/küçük harfe duyarlı olduğunu öğrendim.

Dizin ../../SERVICES/user.service iken import {UserService} from '../../services/user.service'; vardı.

Facepalm emoji nerede?

+1

Dostum, sen benim günümü kurtardın. Bu çok aptalca, klasörüm "Kimlik Doğrulama" idi, bu yüzden otomatik olarak oluşturduğum içe aktarma ifadem "../Authentication/", bu yüzden "../authentication/" olarak değiştirildi ve her şey çalıştı. Belki de iyi bir çözüm, dosya adlarına ve klasör adlarına kapak koymak değildir. Ben hileleri öğrenen bir yeni insanım – Unnie

İlgili konular