Cập nhật (Góc 6 +)
Cách được đề xuất để tạo một dịch vụ đơn lẻ đã thay đổi. Hiện tại nên chỉ định trong trình @Injectable
trang trí trên dịch vụ rằng nó sẽ được cung cấp trong 'root'. Điều này rất có ý nghĩa với tôi và không cần phải liệt kê tất cả các dịch vụ được cung cấp trong các mô-đun của bạn nữa. Bạn chỉ cần nhập các dịch vụ khi bạn cần và họ tự đăng ký ở nơi thích hợp. Bạn cũng có thể chỉ định một mô-đun để nó sẽ chỉ được cung cấp nếu mô-đun được nhập.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Cập nhật (Góc 2)
Với NgModule, cách để làm điều đó bây giờ tôi nghĩ là tạo ra một 'CoreModule' với lớp dịch vụ của bạn trong đó và liệt kê dịch vụ trong các nhà cung cấp của mô-đun. Sau đó, bạn nhập mô-đun lõi trong mô-đun ứng dụng chính của mình, nó sẽ cung cấp một thể hiện cho bất kỳ đứa trẻ nào yêu cầu lớp đó trong các hàm tạo của chúng:
CoreModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ApiService } from './api.service';
@NgModule({
imports: [
CommonModule
],
exports: [ // components that we want to make available
],
declarations: [ // components for use in THIS module
],
providers: [ // singleton services
ApiService,
]
})
export class CoreModule { }
AppModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppComponent } from './app.component';
import { CoreModule } from './core/core.module';
@NgModule({
declarations: [ AppComponent ],
imports: [
CommonModule,
CoreModule // will provide ApiService
],
providers: [],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Câu trả lời gốc
Nếu bạn liệt kê một nhà cung cấp bootstrap()
, bạn không cần liệt kê chúng trong trang trí thành phần của bạn:
import { ApiService } from '../core/api-service';
@Component({
selector: 'main-app',
templateUrl: '/views/main-app.html',
// DO NOT LIST PROVIDERS HERE IF THEY ARE IN bootstrap()!
// (unless you want a new instance)
//providers: [ApiService]
})
export class MainAppComponent {
constructor(private api: ApiService) {}
}
Trong thực tế, việc liệt kê lớp của bạn trong 'nhà cung cấp sẽ tạo ra một thể hiện mới của nó, nếu bất kỳ thành phần cha mẹ nào đã liệt kê nó thì trẻ em không cần và nếu chúng làm thì chúng sẽ có một thể hiện mới.
UserService
vàFacebookService
vàoproviders
bất cứ nơi nào khác không?