Как я могу вызвать функцию, написанную внутри сервиса, из файла модуля в angular?

#angular #dependency-injection #angular9 #angular-module #ngxs

#angular #внедрение зависимостей #angular9 #angular-модуль #ngxs

Вопрос:

Мне нужно вызвать функцию из sharedService из app.module. Обычно мы делаем это, добавляя внедрение зависимостей и вызывая его внутри класса. Но мой случай здесь другой. Я хочу установить значение из файла службы, когда хранилище ngxs добавляется в качестве поставщика в app.module. У меня нет другого варианта, кроме вызова функции getAcceptedValue() из sharedService, чтобы получить желаемое значение. Я хочу вызвать performStoreOperations в части providers модуля.

 import {SharedService} from './shared.service';

@NgModule({
  imports: [
    NgxsModule.forFeature([
      AuthState,
    ]),
    NgxsResetPluginModule.forRoot(),
    SharedModule,
    NgxsReduxDevtoolsPluginModule.forRoot(),
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent],
  providers: [
    {
      provide: NGXS_PLUGINS,
      useValue: performStoreOperations, // How to call performStoreOperations function here ???????
      multi: true,
    },
  ],

})
export class AppModule {
  constructor(private shared:SharedService){}

  performStoreOperations(state, action, next) {
  {
    let acceptedValue = this.shared.getAcceptedValue(); 
    localStorage.setItem('test',acceptedValue);
    return next(state, action);
  }
}
 

Кто-нибудь может помочь?

Комментарии:

1. Во-первых, вам нужно предоставить сервис в его корневом модуле в NgModule providers:[] , а затем просто импортировать модуль в свой модуль reqd или просто импортировать сервис в свой компонент

2. Может useFactory быть, вместо этого использовать и вызывать функцию непосредственно из службы?

3. @matsch Я тоже пробовал использовать фабричный метод. Но когда мы используем useFactory, нам придется включать зависимости. Я смог добавить зависимость в качестве deps . Но при вызове этой функции из службы возникает ошибка циклической зависимости.

Ответ №1:

Вы можете сделать это следующим образом.

SharedService из модуля A

 
    scroll(el: HTMLElement, behaviour: any = "smooth", block: any = "start", inline: any = "nearest") {
        el.scrollIntoView({ behavior: behaviour, block: block, inline: inline })
      }

 

Модуль A

     @NgModule({
      declarations: [],
      imports: [//some components],
      exports: [//some components],
      providers: [
        SharedService,
      ]
    })
    export class SharedModule { }

 

some.component.ts

     import {sharedService} from 'your/path/t
    constructor(private sharedService: SharedService){}
    //do something with this.sharedService.scroll(param1,...........etc)
 

Комментарии:

1. Спасибо за ответ. Но моя проблема не в вызове службы из компонента. Я хочу вызвать ее непосредственно из модуля.