我是Angular的新手,我想在documentation之后在这里配置Singleton服务。
好吧,我的服务需要导入存储。 因此,我这样做了,但是它没有按我期望的那样工作:
app.modules.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy, ModalController } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { ModalWeek } from './modal/modal';
import { FormsModule } from '@angular/forms';
import { IonicStorageModule } from '@ionic/storage';
import { Storage } from '@ionic/storage';
import { Protocol } from './protocol';
let obj = {
storage: Storage,
weeks: new Protocol
}
@NgModule({
declarations: [AppComponent, ModalWeek],
exports: [ModalWeek],
entryComponents: [ModalWeek],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
FormsModule,
IonicStorageModule.forRoot()
],
providers: [
StatusBar,
SplashScreen,
TaskServiceModule.forRoot(obj), // *** my service *** //
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
我从VS Code中收到一条错误消息:
“类型{storage:typeof Storage}的参数不可分配(...) 存储类型中不存在存储”
更新
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { Protocol } from 'src/app/protocol';
@Injectable({
providedIn: 'root', // it is a Singleton
})
export class TaskService {
private weeks: any
private protocol: any
constructor (private storage: Storage, protocol: Protocol) {
this.storage = storage
this.protocol = protocol
// ...
}
// ...
}
答案 0 :(得分:0)
如果您的TaskServiceModule
(如名称所示)是一个模块,那么它首先应该进入imports
数组而不是providers
。查看模块的forRoot(...)
实现也将很有帮助,但是我敢肯定您甚至不需要它。
通过导入IonicStorageModule
,您已经完成了在模块中使用其服务所需的操作,因为它会导出相关的服务。有关更多信息,您可能需要看看their docs。
如果Protocol
也是您的服务,只需将其与您要向您的模块公开的其他服务一起放在providers
中,就像这样:
providers: [
...
Protocol
]
请注意,这实际上与使用以下命令装饰服务相同:
@Injectable({
providedIn: AppModule
})
您可以查看this article,以更好地了解依赖项注入的不同方式。
现在,您也可以选择将TaskService
的装饰器更改为:
@Injectable({
providedIn: 'root'
})
只是:
@Injectable()
因此可以像在AppModule
中介绍的那样,在您的Protocol
中提供您的服务。 我个人认为,这可以使您更好地了解如何在Angular中提供服务,尤其是如果您不熟悉该主题。请记住,这是可选的!
为了给您更好的解决问题的建议,您需要与我们分享有关您的项目结构的更多信息。
我希望这已经对您有所帮助!