Saya ingin memasukkan layanan ke dalam kelas yang bukan merupakan komponen .
Sebagai contoh:
Myservice
import {Injectable} from '@angular/core';
@Injectable()
export class myService {
dosomething() {
// implementation
}
}
Kelasku
import { myService } from './myService'
export class MyClass {
constructor(private myservice:myService) {
}
test() {
this.myservice.dosomething();
}
}
Solusi ini tidak berhasil (saya pikir karena MyClass
belum dibuat instance-nya).
Apakah ada cara lain untuk menggunakan layanan di kelas (bukan komponen)? Atau apakah Anda menganggap desain kode saya tidak sesuai (untuk menggunakan layanan di kelas yang bukan komponen)?
Terima kasih.
sumber
private
ini tidak diperlukan, karenainjector
tidak digunakan di luar konstruktor, oleh karena itu tidak perlu menyimpan referensi di bidang.Bukan jawaban langsung untuk pertanyaan tersebut, tetapi jika Anda membaca ini SO karena alasan saya ini dapat membantu ...
Katakanlah Anda menggunakan ng2-translate dan Anda benar-benar ingin
User.ts
kelas Anda memilikinya. Anda langsung terpikir adalah menggunakan DI untuk memasukkannya, lagipula Anda melakukan Angular. Tapi itu agak berlebihan, Anda bisa meneruskannya di konstruktor Anda, atau menjadikannya variabel publik yang Anda setel dari komponen (di mana Anda mungkin melakukannya).misalnya:
import { TranslateService } from "ng2-translate"; export class User { public translateService: TranslateService; // will set from components. // a bunch of awesome User methods }
lalu dari beberapa komponen terkait pengguna yang memasukkan TranslateService
addEmptyUser() { let emptyUser = new User("", ""); emptyUser.translateService = this.translateService; this.users.push(emptyUser); }
Mudah-mudahan ini membantu orang-orang di luar sana seperti saya yang akan menulis lebih sulit untuk mempertahankan kode karena terkadang kita terlalu pintar =]
(CATATAN: alasan Anda mungkin ingin menyetel variabel daripada menjadikannya bagian dari metode konstruktor Anda adalah Anda dapat mengalami kasus di mana Anda tidak perlu menggunakan layanan, jadi selalu diminta untuk meneruskannya berarti memasukkan impor tambahan / kode yang tidak pernah benar-benar digunakan)
sumber
translateService
get / set di managet
melempar kesalahan yang berarti daripada pengecualian NullReference jika Anda lupa menyetelnyaIni agak ( sangat ) hacky, tetapi saya pikir saya juga akan membagikan solusi saya. Perhatikan bahwa ini hanya akan bekerja dengan layanan Singleton (disuntikkan di root aplikasi, bukan komponen!), Karena mereka hidup selama aplikasi Anda, dan hanya ada satu contoh darinya.
Pertama, dalam layanan Anda:
@Injectable() export class MyService { static instance: MyService; constructor() { MyService.instance = this; } doSomething() { console.log("something!"); } }
Kemudian di kelas mana pun:
export class MyClass { constructor() { MyService.instance.doSomething(); } }
Solusi ini bagus jika Anda ingin mengurangi kekacauan kode dan tidak menggunakan layanan non-tunggal.
sumber
locator.service.ts
import {Injector} from "@angular/core"; export class ServiceLocator { static injector: Injector; }
app.module.ts
@NgModule({ ... }) export class AppModule { constructor(private injector: Injector) { ServiceLocator.injector = injector; } }
poney.model.ts
export class Poney { id: number; name: string; color: 'black' | 'white' | 'brown'; service: PoneyService = ServiceLocator.injector.get(PoneyService); // <--- HERE !!! // PoneyService is @injectable and registered in app.module.ts }
sumber
injector.get()
panggilan ke modul berfungsi (dengan asumsi layanan stateless sehingga beberapa kelas dapat "berbagi" instance yang sama)?Jika metode layanan Anda adalah fungsi murni, cara bersih untuk mengatasinya adalah dengan memiliki anggota statis di layanan Anda.
layanan Anda
import {Injectable} from '@angular/core'; @Injectable() export class myService{ public static dosomething(){ //implementation => doesn't use `this` } }
kelasmu
export class MyClass{ test(){ MyService.dosomething(); //no need to inject in constructor } }
sumber