我是Anluar和前端开发的新手,但我正在做一个相当大的项目,就在最近,我不得不在其中实现自定义主题,问题是在我完成之后,它在你更改*ngIf
个值后停止更新HTML.
我怀疑我实现自定义主题的方式可能与此有关,所以我将开始分享这部分代码: styles.scss
/* You can add global styles to this file, and also import other style files */
@import 'Custom-theme.scss';
html,
body {
height: 100%;
}
body {
margin: 0;
font-family: Roboto, "Helvetica Neue", sans-serif;
}
Custom-theme.scss
@use '@angular/material' as mat;
@include mat.core();
$light-primary: mat.define-palette(mat.$blue-palette);
$light-accent: mat.define-palette(mat.$indigo-palette);
$light-warn: mat.define-palette(mat.$red-palette);
$light-theme: mat.define-light-theme((color:(primary: $light-primary,
accent: $light-accent,
warn: $light-warn )));
@include mat.all-component-themes($light-theme);
.dark-theme {
$dark-primary: mat.define-palette(mat.$deep-orange-palette);
$dark-accent: mat.define-palette(mat.$amber-palette);
$dark-warn: mat.define-palette(mat.$red-palette);
$dark-theme: mat.define-dark-theme((color:(primary: $dark-primary,
accent: $dark-accent,
warn: $dark-warn )));
@include mat.all-component-colors($dark-theme);
}
.light-background {
background-color: rgba(0, 0, 0, 0.02);
}
.dark-background {
background-color: #303030;
}
这就是我改变主题的方式: header.component.ts:
constructor(
public cookieService: CookieService,
public dialog: MatDialog,
public router: Router,
public translateService: TranslateService,
private responsive: BreakpointObserver,
private render: Renderer2,
@Inject(DOCUMENT) private document: Document,
media: MediaMatcher,
) {
this.mobileQuery = media.matchMedia('(max-width: 600px)');
this.langs = this.translateService.getLangs();
this.selectedLang = this.translateService.currentLang;
this.userId = cookieService.get('UserId');
}
ngOnInit() {
this.responsive.observe(['(min-width: 1022px)'])
.subscribe(result => {
this.isMobile = result.matches;
});
}
changedTheme(): void {
this.render.removeClass(this.document.body, 'light-theme');
this.render.removeClass(this.document.body, 'dark-theme');
this.render.removeClass(this.document.body, 'light-background');
this.render.removeClass(this.document.body, 'dark-background');
this.render.addClass(this.document.body, this.selectedTheme.toLowerCase() + '-theme');
this.render.addClass(this.document.body, this.selectedTheme.toLowerCase() + '-background');
}
函数changedTheme
在另外两个组件app.component.ts
和settings.component.ts
中使用(实际上是复制和粘贴),因为我还需要管理这两个组件上的主题.
我在想,是否有可能"发出"一个事件来改变主题,但我不确定这是不是糟糕的做法,这不是这个问题的主要目的. 然而,在这方面我需要一些帮助.我没有任何其他专门更改或手动更新视图的代码.
PS:我不得不把.light-background
和dark-background
类放在一起,因为主题不会因为某种原因改变背景
Update个
好的,在我编写主题之前,我使用了Git并返回,问题仍然存在.重新启动了计算机,重新下载了node_modules
,并在多个浏览器中进行了测试,即使没有主题问题仍然存在.现在我真的不知道该怎么办.唯一的区别是,它go 掉了@angular/flex-layout
,但即使我强迫它保留它,这个问题仍然存在.我应该在哪里调试这种问题?
Update 2个
几乎一整天的工作调试提交后,提交一次又一次,我做到了.问题不是主题,而是我的header.html
组件.我不得不对它做了一些技巧,以使其响应移动和桌面,他们有不同的界面,原因是有些东西坏了.不知道为什么或者怎么的,但是找到另一种方法来做响应部分比解决我制造的这个问题更容易.
以下是破解的代码:
<div style="display: contents;">
<mat-toolbar color="primary" class="header-top">
<div style="display: contents;" *ngIf="!isMobile">
<button mat-icon-button (click)="snav.toggle()" class="icon-button">
<img class="icon" src="../assets/imgs/1315254.png" alt="profile" />
</button>
<span class="toolbar-text" (click)="goToPage('home')">{{ cookieService.get('Username') }}</span>
<button mat-icon-button (click)="goToPage('access')" *ngIf="!userId">
<mat-icon>manage_accounts</mat-icon>
</button>
</div>
<div style="display: contents;" *ngIf="isMobile">
<span class="toolbar-text" (click)="goToPage('home')">FindME!</span>
<span class="spacer"></span>
<mat-form-field style="margin-top: 20px;" *ngIf="isDevMode()">
<mat-select [(value)]="selectedLang" (valueChange)="changedLanguage()" id="lang-select">
<mat-option *ngFor="let lang of langs" [value]="lang">
{{ lang.split('-')[0].toUpperCase() }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-icon-button (click)="goToPage('access')" *ngIf="!userId">
<mat-icon>manage_accounts</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="notifications" *ngIf="userId">
<mat-icon>notifications</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="chat" *ngIf="userId">
<mat-icon>chat</mat-icon>
</button>
<button mat-icon-button class="icon-button" [matMenuTriggerFor]="menu" *ngIf="userId">
<img class="icon" src="../assets/imgs/1315254.png" alt="profile" />
</button>
<!-- Menu -->
<mat-menu #menu="matMenu">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>account_circle</mat-icon>
<span>{{ 'HEADER.PROFILE' | translate }}</span>
</button>
<button mat-menu-item (click)="goToPage('settings')">
<mat-icon>settings</mat-icon>
<span>{{ 'HEADER.SETTINGS' | translate }}</span>
</button>
<button mat-menu-item (click)="logout()">
<mat-icon>logout</mat-icon>
<span>{{ 'HEADER.LOGOUT' | translate }}</span>
</button>
</mat-menu>
<!-- Notifications -->
<mat-menu #notifications="matMenu">
<h1 *ngIf="userNotifications == null">{{ "HEADER.NO-NEW-NOTIFICATIONS" | translate }}</h1>
<div *ngIf="userNotifications != null">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>notifications</mat-icon>
</button>
</div>
</mat-menu>
<!-- Chat -->
<mat-menu #chat="matMenu">
<h1 *ngIf="chats == null">{{ "HEADER.NO-NEW-CONVERSATION" | translate }}</h1>
<div *ngIf="chats != null">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>chat</mat-icon>
</button>
</div>
</mat-menu>
<button mat-icon-button aria-label="icon-button with share icon" (click)="goToPage('about')">
<mat-icon>help</mat-icon>
</button>
</div>
</mat-toolbar>
<mat-sidenav-container class="example-sidenav-container">
<mat-sidenav #snav [mode]="'over'" fixedTopGap="102">
<mat-nav-list>
<mat-selection-list role="list">
<mat-divider></mat-divider>
<mat-list-item role="button" *ngIf="userId">
<a (click)="goToPage('notifications')">
{{ 'NOTIFICATIONS' | translate }}
</a>
</mat-list-item>
<mat-divider></mat-divider>
<mat-list-item role="button" *ngIf="userId">
<a (click)="goToPage('chat')">
{{ 'CHATS' | translate }}
</a>
</mat-list-item>
<mat-divider></mat-divider>
</mat-selection-list>
</mat-nav-list>
</mat-sidenav>
<mat-sidenav-content>
<router-outlet></router-outlet>
</mat-sidenav-content>
</mat-sidenav-container>
</div>
解决了这个问题,把它恢复到我让它与手机兼容之前的状态:
<mat-toolbar color="primary" class="header-top">
<span class="toolbar-text" (click)="goToPage('home')">FindME!</span>
<span class="spacer"></span>
<mat-form-field>
<mat-select [(value)]="selectedLang" (valueChange)="changedLanguage()" id="lang-select">
<mat-option *ngFor="let lang of langs" [value]="lang">
<!-- {{ lang | translate }} -->
{{ lang.split('-')[0].toUpperCase() }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-icon-button (click)="goToPage('access')" *ngIf="!cookieService.get('UserId')">
<mat-icon>manage_accounts</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="notifications" *ngIf="cookieService.get('UserId')">
<mat-icon>notifications</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="chat" *ngIf="cookieService.get('UserId')">
<mat-icon>chat</mat-icon>
</button>
<button mat-icon-button class="icon-button" [matMenuTriggerFor]="menu" *ngIf="cookieService.get('UserId')">
<img class="icon" src="../assets/imgs/1315254.png" alt="profile" />
</button>
<!-- Menu -->
<mat-menu #menu="matMenu">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>account_circle</mat-icon>
<span>{{ 'HEADER.PROFILE' | translate }}</span>
</button>
<button mat-menu-item (click)="goToPage('settings')">
<mat-icon>settings</mat-icon>
<span>{{ 'HEADER.SETTINGS' | translate }}</span>
</button>
<button mat-menu-item (click)="logout()">
<mat-icon>logout</mat-icon>
<span>{{ 'HEADER.LOGOUT' | translate }}</span>
</button>
</mat-menu>
<!-- Notifications -->
<mat-menu #notifications="matMenu">
<h1 *ngIf="userNotifications == null">{{ "HEADER.NO-NEW-NOTIFICATIONS" | translate }}</h1>
<div *ngIf="userNotifications != null">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>notifications</mat-icon>
</button>
</div>
</mat-menu>
<!-- Chat -->
<mat-menu #chat="matMenu">
<h1 *ngIf="chats == null">{{ "HEADER.NO-NEW-CONVERSATION" | translate }}</h1>
<div *ngIf="chats != null">
<button mat-menu-item (click)="goToPage('profile')">
<mat-icon>chat</mat-icon>
</button>
</div>
</mat-menu>
<button mat-icon-button aria-label="icon-button with share icon" (click)="goToPage('about')">
<mat-icon>help</mat-icon>
</button>
</mat-toolbar>
所以我觉得很蠢很抱歉浪费了你的时间.也许我会删除这个问题,因为它没有帮助任何人在所有,但是的,感谢您的帮助和关注!!