Как предотвратить мерцание при использовании * ngIf? - PullRequest
1 голос
/ 21 января 2020

В моем app.component. html:

<html>
    <head></head>
    <body>
        <header *ngIf="loggedIn && showHeader"></header>
        <router-outlet></router-outlet>
    </body>
</html>

В моем app.component.ts :

export class AppComponent {

    constructor(private HeaderService: HeaderService, private AuthService: AuthService) { }

    get loggedIn(): boolean { return this.AuthService.getUserState(); }    
    get showHeader(): boolean { return this.HeaderService.getToggleState(); }
}

В моем header.service.ts :

Мы создали этот сервис, потому что после входа в систему есть другие определенные c компоненты, где заголовок также должен быть скрыт.

@Injectable({
    providedIn: 'root'
})

export class HeaderService {

    showHeader = true;

    constructor() { }

    setToggleState(state: boolean) {
       this.showHeader = state;
    }

    getToggleState() { return this.showHeader; }
}

Теперь в моем login.component заголовок должен быть невидимым.

То, что происходит сейчас, заключается в том, что есть краткий миг (кажется, что происходит, когда вы входите в систему, а затем выходите из системы и возвращаетесь на страницу входа), когда заголовок виден до того, как он скрыт (и да, также выдает up ExpressionChangedAfterItHasBeenCheckedError).

Какой лучший способ добиться этого? Должен ли я просто установить showHeader в false по умолчанию?

login.component.ts

export class LoginComponent implements OnInit {

  ngOnInit() {
       // To hide the header
       this.HeaderService.setToggleState(false);
  }
}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Когда вы используете *ngIf, элемент не находится в DOM (если условие false) и будет помещен в DOM во время выполнения.

Вместо этого вы можете использовать [hidden]="<your condition>", потому что тогда ваш элемент будет присутствовать в DOM, даже если условие false. Если затем ваше условие изменится на true, элементы opacity будут изменены с 0 на 1, что делает элемент видимым.

Теперь, чтобы получить более плавный переход, Вы можете добавить CSS к вашему элементу DOM следующим образом:

.your-element {
    transition: visibility 0.5s;
}

Таким образом, вы получите эффект, напоминающий зависание.

Кроме того, для вашей второй проблемы (короткое мерцание заголовок перед данными): это можно объяснить, потому что вы инициализируете showHeader с true. Сначала он появляется, затем внезапно исчезает при инициализации службы. Так что в этом случае просто установите его на false при инициализации.

Надеюсь, это поможет:)

0 голосов
/ 21 января 2020

Вы можете просто добавить

ngOnDestroy(){
    this.service.setToggleState(true);
  }

в компонент входа в систему. Вы можете установить значение по умолчанию в true в сервисе. затем, когда вам не нужно отображать заголовок, в котором компоненты, тогда установите для ngoninit значение false и для ngondestroy значение true, чтобы избежать мерцания.

см. здесь, например, https://stackblitz.com/edit/angular-krit8a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...