Angular: 如何使用 IonicStorageModule 中的 Storage?

Angular: how to use Storage from IonicStorageModule?

我是 Angular 的新手...我正在尝试在此处配置 Singleton 服务,遵循 documentation.

嗯,我的服务需要导入Storage。 所以我这样做了,但它没有像我预期的那样工作:

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 收到一条错误消息:

"Argument of type {storage: typeof Storage} is not assignable (...) storage does not exist in type 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   
        // ...
    }
    // ...
}

如果您的 TaskServiceModule(顾名思义)是一个模块,那么它应该首先进入您的 imports 数组而不是 providers。查看模块的 forRoot(...) 实现也会很有帮助,但我敢肯定您甚至不需要它。

通过导入 IonicStorageModule,您已经完成了在您的模块中使用它的服务所需的操作,因为它导出了相关服务。有关这方面的更多信息,您可能想看看 their docs

如果 Protocol 也是您的服务,只需将它与您想要向模块公开的其他服务一起放在 providers 中,如下所示:

providers: [
    ...
    Protocol
]

请注意,这实际上与用以下方式装饰您的服务相同:

@Injectable({
    providedIn: AppModule
})

您可以查看 this article 以更好地了解不同的依赖注入方式。

现在您还可以选择更改 TaskService 的装饰器:

@Injectable({
    providedIn: 'root'
})

只是:

@Injectable()

因此,在您的 AppModule 中提供您的服务,就像我们已经介绍过的 Protocol 一样。 我个人认为这可以让您更好地了解 Angular 中的服务是如何提供的,尤其是如果您是该主题的新手。 请记住,这是可选的!

为了就如何解决您的问题向您提供更好的建议,您需要与我们分享有关您的项目结构的更多信息。

希望这对您有所帮助!