2017-01-01 2 views
2

Я не могу найти правильное выражение для правильной оценки ngIf.Angular2 ngIf не обновлять DOM?

Я следил за простым Angularfire2 example here, и он позволяет мне войти в систему и выйти из системы правильно.

import { Component } from '@angular/core'; 
import { AngularFire } from 'angularfire2'; 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <div> {{ (af.auth | async)?.uid }} </div> 
    <button (click)="login()">Login</button> 
    <button (click)="logout()">Logout</button> 
    `, 
}) 
export class AppComponent { 
    constructor(public af: AngularFire) { 
    this.af.auth.subscribe(auth => console.log(auth)); 
    } 

    login() { 
    this.af.auth.login(); 
    } 

    logout() { 
    this.af.auth.logout(); 
    } 
} 

Я хочу изменить код, чтобы отображать/скрыть правильные кнопки в зависимости от состояния входа. Я вижу на консоли, что auth переключается с нуля на объект и обратно, но DOM не обновляется.

Вот последняя попытка:

<div> {{ (af.auth | async)?.uid }} </div> 
<button *ngIf="!(auth | async)" (click)="login()">Login</button> 
<button *ngIf="auth | async" (click)="logout()">Logout</button> 

Что я делаю неправильно? Как я могу правильно оценить это?

+0

Вы не можете видеть ** ** Auth параметр функции подписываться из шаблона HTML. Вам лучше создать логическую переменную в классе, установить ее в подписчике и передать ее в предложении ngIf, чтобы скрыть/показать кнопки. –

+1

IS AUTH возвращает логическое значение? Что говорит console.log для auth? – deek

+0

@deek auth - это объект. В журнале отображается «null» или действительный объект со свойствами при нажатии кнопок. –

ответ

1

EDIT: Вы не подписываетесь на измененный статус входа в систему login и logout, поэтому вы должны добавить методы this.af.auth.subscribe(auth => this.auth = auth);.

Я не знаком с Angularfire, но ... если auth переключается с null и обратно, вы можете хранить и использовать это. Храните его, например, когда вы подписываетесь, вы можете подписаться auth => this.auth = auth вместо console.log, то вы могли бы просто использовать его так:

<button *ngIf="auth == null" (click)="login()">Login</button> 
<button *ngIf="auth != null" (click)="logout()">Logout</button> 

Может быть, это не самый лучший способ. Вы также можете создать логическое значение, например isLogged, и использовать его для отображения/скрытия кнопок.

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

+0

Я также пробовал этот способ, и он не работает. Должно быть, правда? –

+0

Да, должно. Только что поняли, глядя на свой код после хорошей ночи сна, подписываетесь на свои изменения где угодно, когда нажимаете кнопку? Я имею в виду, что вы только подписываетесь в конструкторе при навигации по странице ... Если вы нажмете кнопку входа в систему, когда вы не вошли в систему, вы не подписываетесь на измененный статус входа, поэтому статус кнопки также не изменится. Или я сейчас что-то не понимаю? – Alex

+0

Я добавил логическое значение и в подписке на auth я изменяю его значение, и теперь он работает, и он похож на ваше решение (измените локальное на основе подписки). У @MeteCantimur было подобное предложение. Благодарю. –

0

Я думаю, вы должны искать AsyncPipe и safe navigation operator (?.) понять (af.auth | async)?.uid выражение:

template: ` 
<div [ngSwitch]="(af.auth | async)?.uid"> 
<button *ngSwitchCase="null" (click)="login()">Login</button> 
<button *ngSwitchDefault (click)="logout()">Logout</button> 
</div>` 
+0

Интересная идея использовать ngSwitch, но приведенное выше не работает, если auth является допустимым объектом. Является ли «истинный» правильный тест для этого? –

+0

, если вы замените '(af.auth | async) ?. uid' с' (af.auth | async) .uid' это работает? –

+0

Нет, все еще не работает. Спасибо за ссылки на асинхронный и безопасный оператор. Я пошел дальше и принял ответ AJT_82. Приветствия. –

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