加载内容后,Angular 9 将变量更新为 show/hide HTML
Angular9 Update variable to show/hide HTML after content is loaded
组件加载后如何show/hideHTML内容?
我正在尝试 show/hide 页眉工具栏上的一个按钮,该按钮会根据登录状态而变化。
主页中加载了下面的工具栏组件。由于该组件已加载到主页上,因此它永远不会再次重新加载。当我登录时,我想相应地显示和隐藏该离子按钮部分。
登录后,我在我的工具栏组件中调用了 getAndSetLogin() 函数 class,控制台日志显示 loggedIn=true,现在应该隐藏登录部分,但没有 show/hide.
工具栏组件HTML
<ion-header>
<ion-toolbar>
// Hide this button if logged in
<ion-buttons *ngIf="!loggedIn" slot="end">
<ion-button (click)="showLoginPopover($event)">
<ion-label class="header-toolbar-text btn-label">Log In</ion-label>
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
(Toolbar Component.ts) 更新工具栏组件登录状态的函数
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
// loggedInState is either true or false, true if logged in and false otherwise
this.loggedIn = loggedInState;
});
}
以上来自工具栏组件文件的代码在我登录时被触发,现在它只是提供者中的一个按钮,它将 returns 可观察值设置为 true。
我试过添加 ChangeDetectorRef,例如
// Get an observable of the login state
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
this.loggedIn = loggedInState;
this.cd.markForCheck();
// cd = ChangeDetectorRef initliased in the constructor
});
}
但这也没有检测到我的更改。
我是否更正 Angular 仅加载 HTML 一次,因此,只有在 onInit 或构造函数中更改它们时,ngIf 语句才有效。
如何根据登录状态show/hide内容。我听说过使用 RXJS BehaviourSubject 但不确定这会有什么帮助。
您需要为此创建一个 Observable。创建一个 UserService 服务 class 并在其中创建 BehaviourSubject 对象。在成功登录时设置它的值。
像这样:
import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>;
constructor() {
this.isLoggedIn = new BehaviorSubject<boolean>(false);
}
setUserLoggedInStatus(value) {
this.isLoggedIn.next(value);
}
getUserLoggedInStatus(): Observable<any> {
return this.isLoggedIn.asObservable();
}
}
现在在您的组件 class 中,像这样订阅 getUserLoggedInStatus() 函数:
import { Component, OnInit } from '@angular/core';
import { UserService } from '@app/shared/services/user.service';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit {
isLoggedIn: Boolean;
constructor(private userService: UserService) { }
ngOnInit() {
this.userService.getUserLoggedInStatus().subscribe((status)==> {
this.isLoggedIn = status;
});
}
}
您可以在 UserService 文件中保存 loggedInState。
export class UserService{
private logingData;
private loggedIn = false;
constructor(
private http: HttpClient,
) { }
login(){
this.logingData= this.http.post(-call your server-);
return this.logingData;
this.loggedIn = this.logingData.status;
}
}
然后将 loggedIn 变量绑定到工具栏。
在html
<ion-buttons *ngIf="!userService.loggedIn" slot="end">
在 ts
import { UserService} from "your location";
constructor(public userService: UserService){}
然后从Popover组件调用这个方法
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
console.log(loggedInState);
});
}
希望这对you.Thank你有帮助。
在这种情况下使用BehaviourSubject
。
服务文件:
import { Observable, BehaviorSubject } from 'rxjs';
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>(false);
private _isLoggedIn$ = new BehaviorSubject<boolean>(false);
readonly isLoggedIn$ = this._isLoggedIn$.asObservable();
getLoggedInStatus(): Observable<any> {
return this.http.get<any>(url, params).pipe(
map((res) => {
this._isLoggedIn$.next(res);
..... // other logics here
})
);
}
}
组件:
loggedInState$:Observable<any>;
this.loggedInState$ = this.userService.isLoggedIn$();
HTML:(使用异步管道)
<ion-buttons *ngIf="!loggedInState | async" slot="end">
S Rana 的回答几乎有效,我正在发布更改以使其有效
服务文件:
import { Observable, BehaviorSubject } from 'rxjs';
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>(false);
private _isLoggedIn$ = new BehaviorSubject<boolean>(false);
isLoggedIn$ = this._isLoggedIn$.asObservable();
getLoggedInStatus(): Observable<any> {
return this.http.get<any>(url, params).pipe(
map((res) => {
this._isLoggedIn$.next(res);
..... // other logics here
})
);
}
}
组件:
loggedInState$:Observable<boolean>;
this.userService.loggedInChanged$.subscribe((data: any) => {
this.loggedInState$ = data;
}
);
HTML:
<ion-buttons *ngIf="!loggedInState$" slot="end">
组件加载后如何show/hideHTML内容?
我正在尝试 show/hide 页眉工具栏上的一个按钮,该按钮会根据登录状态而变化。
主页中加载了下面的工具栏组件。由于该组件已加载到主页上,因此它永远不会再次重新加载。当我登录时,我想相应地显示和隐藏该离子按钮部分。
登录后,我在我的工具栏组件中调用了 getAndSetLogin() 函数 class,控制台日志显示 loggedIn=true,现在应该隐藏登录部分,但没有 show/hide.
工具栏组件HTML
<ion-header>
<ion-toolbar>
// Hide this button if logged in
<ion-buttons *ngIf="!loggedIn" slot="end">
<ion-button (click)="showLoginPopover($event)">
<ion-label class="header-toolbar-text btn-label">Log In</ion-label>
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
(Toolbar Component.ts) 更新工具栏组件登录状态的函数
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
// loggedInState is either true or false, true if logged in and false otherwise
this.loggedIn = loggedInState;
});
}
以上来自工具栏组件文件的代码在我登录时被触发,现在它只是提供者中的一个按钮,它将 returns 可观察值设置为 true。
我试过添加 ChangeDetectorRef,例如
// Get an observable of the login state
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
this.loggedIn = loggedInState;
this.cd.markForCheck();
// cd = ChangeDetectorRef initliased in the constructor
});
}
但这也没有检测到我的更改。
我是否更正 Angular 仅加载 HTML 一次,因此,只有在 onInit 或构造函数中更改它们时,ngIf 语句才有效。
如何根据登录状态show/hide内容。我听说过使用 RXJS BehaviourSubject 但不确定这会有什么帮助。
您需要为此创建一个 Observable。创建一个 UserService 服务 class 并在其中创建 BehaviourSubject 对象。在成功登录时设置它的值。
像这样:
import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>;
constructor() {
this.isLoggedIn = new BehaviorSubject<boolean>(false);
}
setUserLoggedInStatus(value) {
this.isLoggedIn.next(value);
}
getUserLoggedInStatus(): Observable<any> {
return this.isLoggedIn.asObservable();
}
}
现在在您的组件 class 中,像这样订阅 getUserLoggedInStatus() 函数:
import { Component, OnInit } from '@angular/core';
import { UserService } from '@app/shared/services/user.service';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit {
isLoggedIn: Boolean;
constructor(private userService: UserService) { }
ngOnInit() {
this.userService.getUserLoggedInStatus().subscribe((status)==> {
this.isLoggedIn = status;
});
}
}
您可以在 UserService 文件中保存 loggedInState。
export class UserService{
private logingData;
private loggedIn = false;
constructor(
private http: HttpClient,
) { }
login(){
this.logingData= this.http.post(-call your server-);
return this.logingData;
this.loggedIn = this.logingData.status;
}
}
然后将 loggedIn 变量绑定到工具栏。
在html
<ion-buttons *ngIf="!userService.loggedIn" slot="end">
在 ts
import { UserService} from "your location";
constructor(public userService: UserService){}
然后从Popover组件调用这个方法
public getAndSetLoginState() {
this.userService.checkedLoggedInStatus().subscribe((loggedInState: any) => {
console.log(loggedInState);
});
}
希望这对you.Thank你有帮助。
在这种情况下使用BehaviourSubject
。
服务文件:
import { Observable, BehaviorSubject } from 'rxjs';
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>(false);
private _isLoggedIn$ = new BehaviorSubject<boolean>(false);
readonly isLoggedIn$ = this._isLoggedIn$.asObservable();
getLoggedInStatus(): Observable<any> {
return this.http.get<any>(url, params).pipe(
map((res) => {
this._isLoggedIn$.next(res);
..... // other logics here
})
);
}
}
组件:
loggedInState$:Observable<any>;
this.loggedInState$ = this.userService.isLoggedIn$();
HTML:(使用异步管道)
<ion-buttons *ngIf="!loggedInState | async" slot="end">
S Rana 的回答几乎有效,我正在发布更改以使其有效
服务文件:
import { Observable, BehaviorSubject } from 'rxjs';
export class UserService {
private isLoggedIn: BehaviorSubject<boolean>(false);
private _isLoggedIn$ = new BehaviorSubject<boolean>(false);
isLoggedIn$ = this._isLoggedIn$.asObservable();
getLoggedInStatus(): Observable<any> {
return this.http.get<any>(url, params).pipe(
map((res) => {
this._isLoggedIn$.next(res);
..... // other logics here
})
);
}
}
组件:
loggedInState$:Observable<boolean>;
this.userService.loggedInChanged$.subscribe((data: any) => {
this.loggedInState$ = data;
}
);
HTML:
<ion-buttons *ngIf="!loggedInState$" slot="end">