ngClass не обновляет класс динамически - PullRequest
0 голосов
/ 07 июля 2019

Я хочу изменить внешний вид моей панели навигации, когда свиток находится не сверху.

Я использую Angular Material CdkScrollable и успешно извлекаю событие прокрутки, которое дает мне данныео том, как далеко он до вершины.

У меня проблема в том, что классы CSS никогда не меняются при прокрутке.С помощью console.log я проверяю, что переменная isScrolled корректно обновляется всякий раз, когда я прокручиваю вниз и снова вверх.Так что, кажется, работает хорошо.Я использую ngClass с троичным для проверки того, какой класс CSS должен применяться.

Что-то очевидно, что мне не хватает?

html

<nav [ngClass]="isScrolled ? 'navbar-desktop-scrolled' : 'navbar-desktop'">
   ...
</nav>

тс

export class MainNavComponent implements AfterViewInit {
 @ViewChild(MatSidenavContainer, { static: false }) sidenavContainer: MatSidenavContainer;

 isScrolled: boolean = false;

 ngAfterViewInit() {
    this.sidenavContainer.scrollable.elementScrolled().subscribe((x) => {
      if ((<Element>x.target).scrollTop > 0) {
        this.isScrolled = true;
      } else {
        this.isScrolled = false;
      }

      console.log(this.isScrolled);
    })
  }
}

Ответы [ 4 ]

0 голосов
/ 10 июля 2019

Все работает нормально после того, как я добавил функцию обнаружения изменений.

export class MainNavComponent implements AfterViewInit {
 @ViewChild(MatSidenavContainer, { static: false }) sidenavContainer: MatSidenavContainer;

 isScrolled: boolean = false;

 constructor(private ref: ChangeDetectorRef) { }

 ngAfterViewInit() {
    this.sidenavContainer.scrollable.elementScrolled().subscribe((x) => {
      if ((<Element>x.target).scrollTop > 0) {
        this.isScrolled = true;
      } else {
        this.isScrolled = false;
      }

      this.ref.detectChanges();
    })
  }
}
0 голосов
/ 07 июля 2019

Ознакомьтесь с документацией: ngClass

Object - ключи - это классы CSS, которые добавляются, когда выражение, данное в значении, принимает истинное значение, в противном случае они удаляются.

Это должно выглядеть примерно так:

<some-element [ngClass]="{'navbar-desktop-scrolled': isScrolled , 'navbar-desktop' : !isScrolled  }">...</some-element>
0 голосов
/ 07 июля 2019

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

export class MainNavComponent implements AfterViewInit {
  @ViewChild(MatSidenavContainer, { static: false }) 
  sidenavContainer: MatSidenavContainer;
  navbarType$: Observable<string>;

  ngAfterViewInit() {
    this.navbarType$ = this.sidenavContainer.scrollable.elementScrolled().pipe(
      map(x => x.target.scrollTop > 0
        ? 'navbar-desktop-scrolled'
        : 'navbar-desktop'
      )
    )
  }
}

А в вашем шаблоне используйте

<nav [ngClass]="navbarType$ | async"></nav>
0 голосов
/ 07 июля 2019

используйте ngClass в синтаксисе объекта, например

<nav [ngClass]="{'navbar-desktop-scrolled' :isScrolled, 'navbar-desktop': !isScrolled}">
   ...
</nav>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...