Почему в Angular 2+ предпочтительнее помещать в службы общие переменные, а не хранить их в постоянном объекте, который можно импортировать напрямую? - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю SPA в Angular 7 и хочу следовать передовым методам, но я не до конца понимаю, почему везде рекомендуется хранить данные в сервисах, а не в файле с константой, которую можно напрямую импортировать.

Прямой импорт константы кажется намного проще.Я что-то упустил?

Мой код:

userSession.ts

export const userSession = {
    loggedIn: null,
    userId: null
};

что-то.service.ts :

import { userSession } from '../appGlobals/user-session';
// decorators, ect .......
export class SomethingService {  
  constructor() { }
  doSomething() {
    if (userSession.loggedIn) {
      // do something
    }
  }
}

Предлагаемый код (на мое понимание):

user.service.ts

//imports and decorator ....
export class UserService {
  session = {
    loggedIn: boolean;
    userId: number;
  }
//...
}

some.service.ts

import { UserSession } from '../services/user.service.ts';
// decorators, ect .......
export class SomeService {
  constructor(private userService: UserService) { }
  doSomething() {
    if (this.userService.session.loggedIn) {
      // do something
    }
  }
}

В больших классах, использующих поля пользовательских сессий, код выглядит намного чище, если просто использовать объект «userSession» вместо «this.userService.session» ивнедрить зависимость в конструктор.Каковы же преимущества / недостатки каждой установки?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Одним большим преимуществом является тестирование.

В вашем коде userSession объявлено вне класса, поэтому было бы сложно написать код модульного теста.

Но в предложенном, сервис внедряется в конструктор, поэтому тестовый код может быть написан с сервисом или даже с фиктивным сервисом.

0 голосов
/ 14 февраля 2019

По моему мнению, нет разницы в примере, который вы описываете, однако в большинстве случаев эти общие переменные могут быть не подготовлены, когда компонент, использующий их, полностью загружен, то есть переменная может быть заполнена после вызова API.По этой причине предпочтительны сервисы, которые могут включать в себя надлежащие функциональные возможности для управления этими общими переменными надлежащим и чистым способом.Также имейте в виду, что большинство этих общих переменных представляют собой некоторые виды Observable объектов, которые могут уведомлять компоненты, использующие их, когда значение готово (т. Е. Применяется к сценарию, когда значения заполняются впоследствии или могут быть изменены).

...