2

Имеется шаблон вида: <li *ngIf="userService.isLoggedIn">. Не хочется напрямую выводить сервис в шаблон, а, например, присвоить какой-то переменной: this.isLoggedIn = userService.isLoggedIn, но в данном случае изменения сервиса не затрагивают объявленную переменную, там по прежнему будет старое значение. Можно использовать Subject и подписываться на него, но получается громоздко, например: this.userService.isLoggedIn.asObservable().subscribe(isLoggedIn => this.isLoggedIn = isLoggedIn);

Есть ли еще какие-нибудь решения? И насколько вообще правильно/неправильно работать с сервисом в шаблоне.

Vlad M
  • 21
  • 1
    использовать в шаблоне норм практика, если не прав, то объясните почему нет... просто в конструкторе компонента ставь модификатор public , чтобы было ясно, где искать... ну и старое значение там не будет, если у тебя синглтон и сервис инициализируется при старте приложения, тут скорее дело вкуса... – Artsiom Sep 18 '17 at 12:11
  • Ещё как вариант можно написать функцию или геттер, который будет возвращать значение из сервиса (и в шаблоне обращаться к этой функции/геттеру). Но напрямую обращаться мне больше нравится – diralik Sep 18 '17 at 12:40
  • @Artsiom, не совсем нормальная. Считается, что это увеличивается связность между компонентами кода, и будет проблематично что-то изменить, если вдруг понадобится – Grundy Sep 19 '17 at 06:17
  • @Grundy я с вами соглашусь, в иных случаях я тоже делаю обёртку внутри компонента, но если дело касается userService, то удобнее с ним работать в шаблоне тк изменяться там нечему, в ином случае выйдет тонна кода в каждом компоненте – Artsiom Sep 19 '17 at 06:54
  • @Artsiom, удобнее до момента, пока какое-то из полей используемое во вью не будет вынесено в другой сервис например. В идеале это все должно было решаться с помощью разбиения компонентов на более мелкие, тогда в каждом компоненте не будет тонны кода – Grundy Sep 19 '17 at 07:00
  • @Grundy ну здесь вы говорите исключительно про best practicies, но по факту у нас естт заказчик, сроки, настроение и ещё куча факторов, разбивать каждый компонент на микро не есть хороший вариант, я могу сделать вывод, что правильный ответ здесь будет в зависимости от конкретной ситуации – Artsiom Sep 19 '17 at 07:14
  • @Artsiom, ну так и автор вопроса про них спрашивает :-) – Grundy Sep 19 '17 at 07:17
  • @Grundy думаю автору хватит двух разных точек зрения, чтобы сделать выводы, спасибо) – Artsiom Sep 19 '17 at 07:28

1 Answers1

0

Напишите функцию в контроллере:

isAuthenticate() { 
    return userService.isLoggedIn;
}

Соответственно в разметке:

<li *ngIf="isAuthenticate()">

В случае, изменения значения в сервисе, вы его на очередном цикле получите в своём контроллере.

Sergey Rogachev
  • 632
  • 6
  • 18