2017-02-03 4 views
0

У меня есть кнопка на панели навигации (app.component.html), которую я хочу показывать только при входе пользователя. Это мой текущий подход, который не работает для очевидные резоны объясняются позже. Я хочу, чтобы узнать, как я могу модифицировать его для работыУгловая 2 - Обновить вид при изменении переменной

Внутри моей app.component.html я кнопка включения

следующей
<button *ngIf="isCurrentUserExist">MyButton</button> 

Внутри моего app.component.ts, я пытаюсь объять переменная isCurrentUserExist для функции, которая возвращает true, если пользователь существует. Я считаю, что это проблема, потому что этот код выполняется только один раз в OnInit, как противостоять какой-то образом сохраняя вид обновленный

ngOnInit() { 
    this.isCurrentUserExist = this.userService.isCurrentUserExist();  
} 

Для referenrce, в моем UserService.ts экспорта класс UserService {

private currentUser: User 

    constructor(private http: Http,private angularFire: AngularFire) { } 

    getCurrentUser(): User { 
     return this.currentUser 
    } 

    setCurrentUser(user: User) { 
     this.currentUser = user; 
    } 

    isCurrentUserExist(): boolean { 
     if (this.currentUser) { 
     return true 
     } 
     return false 
    } 
} 

Abit больше информации о моем приложении ... При запуске, когда пользователь не существует, у меня есть экран входа в систему (компонент входа). Когда пользователь входит в систему, он идет к firebase и захватить информацию о пользователе (асинхронной) и сохранить его в моей службе пользователя через

setCurrentUser(user: User) 

Так что на данный момент, я хотел бы обновить кнопку в моей панели навигации (который существует в app.component.html) и покажите кнопку.

Что я могу сделать для этого?

ответ

3

давайте попробуем это: с помощью BehaviorSubject

UserService.ts

import { Subject, BehaviorSubject} from 'rxjs'; 

export class UserService { 

    private currentUser: User; 
    public loggedIn: Subject = new BehaviorSubject<boolean>(false); 

    constructor(private http: Http,private angularFire: AngularFire) { } 

    getCurrentUser(): User { 
     return this.currentUser 
    } 

    setCurrentUser(user: User) { // this method must call when async process - grab firebase info - finished 
     this.currentUser = user; 
     this.loggedIn.next(true); 
    } 

    isCurrentUserExist(): boolean { 
     if (this.currentUser) { 
     return true 
     } 
     return false 
    } 
} 

app.component.ts

ngOnInit() { 
    this.userService.loggedIn.subscribe(response => this.isCurrentUserExist = response);  
} 
+0

Hi Тьеп. Спасибо за это. Он работает очень хорошо. Раньше я думал о линии излучателя событий. Тем не менее, я не хотел использовать его, если я не отчаялся, потому что он чувствует, что сигналы пролетают по воздуху, ожидая, когда кто-то схватит его (вроде напоминания толчка). Этот BehaviorSubject действительно похож на какой-то эмитент событий? Знаете ли вы, есть ли другой подход (для целей обучения) – user172902

+1

, вы можете создать собственную систему эмиттеров событий (возможно, базу на наблюдаемом), а затем где-нибудь вы можете подписаться на какое-то событие, например «user.login» (Ionic 2 собственная система событий). всякий раз, когда событие срабатывает, вы получите ценность - полезную нагрузку - чтобы делать все, что вам нравится. –

1

в app.component.ts вам назначено значение из функции один раз. Поэтому он никогда не изменится. Для решения этой проблемы и для обновления в реальном времени используйте назначение экземпляра функции с логической переменной this.isCurrentUserExist = this.userService.isCurrentUserExist;. И в виду изменение изменения *ngIf выражение как функция isCurrentUserExist().

+0

Не работает unfortuantelly – user172902

Смежные вопросы