вызов службы внутри файла состояния Ngxs

Я хочу позвонить в службу поддержки внутри своего auth.state.ts. Вот мой файл состояния:

import { EmitterAction, Receiver } from '@ngxs-labs/emitter';
import { Selector, State, StateContext } from '@ngxs/store';
import { TokenResponse, User } from '../models';
import { UserDetailsService } from '../profile/user-profile/user-details.service';

// actions
export class GetUser {
  constructor(private userDetailsService: UserDetailsService) {}
  static readonly type = '[Auth] GetUser';
}
interface AuthStateModel {
  user?: User;
  tokenResponse?: TokenResponse;
}

@State<AuthStateModel>({
  name: 'auth'
})
export class AuthState {
  constructor(private userDetailsService: UserDetailsService) {}

  @Selector()
  static user(state: AuthStateModel) {
    return state.user;
  }

 @Action(GetUser)
     getUser(ctx: StateContext<AuthStateModel>, action: GetUser, userDetailsService: UserDetailsService) {
        console.log('get user');
        // console.log(userDetailsService.userDetailsUrl);

    return userDetailsService
      .getUserInfo()
      .pipe(take(1))
      .subscribe(
        (res: any) => {
          console.log(res.message);
          ctx.patchState({ user: res.message });
        },
        (err: HttpErrorResponse) => {
          console.log(err);
        }
      );
}
}

Но здесь он не получит моего userDetailsService, его методов и свойств. ***Примечание*

Этот auth.state.ts файл импортирован в мой app.module.ts, а также userDetailsService.ts включен в provide раздел app.module.ts.

Пожалуйста, помогите мне с этим, заранее спасибо


person Kalanka    schedule 07.01.2019    source источник
comment
Удалите параметр userDetailsService из метода getUser и из объявления действия GetUser.   -  person Zdenek Hatak    schedule 07.01.2019


Ответы (1)


Как упоминалось в комментарии @Zdenek, вам нужно удалить это из подписи getUser, поскольку он уже введен в ваше состояние, поэтому вы можете получить к нему доступ через this.userServiceDetails.

Кроме того, когда вы его вызываете, предпочтительным шаблоном является использование pipe и tap для обработки результата, а не подписка непосредственно в функции getUser. Используя _6 _ / _ 7_ для формулировки наблюдаемого, затем верните его в NGXS, чтобы фреймворк позаботился о подписке,

person Garth Mason    schedule 09.01.2019
comment
привет @Garth, допустим, я хочу добавить this.userServiceDetails в @Selector() внутри метода static user. это вызовет ошибку. Итак, если мы удалим static, он заработает. к сожалению, в файле app component будет другая ошибка, когда @Select(AuthState.user) ~ ›user не существует для типа 'typeof AuthState'. у тебя есть идеи? - person Fai Zal Dong; 10.05.2019
comment
не стоит беспокоиться. Это можно исправить, объявив static user; перед constructor - person Fai Zal Dong; 10.05.2019