Я создал простой веб-(трафаретный) компонент AuthGuard
, его не следует путать с AuthGuard Angular.
Цель этого компонента - проверить, вошел ли пользователь в систему. .
- Если да, выполните рендеринг слота html.
- Если нет, выполните визуализацию кнопки регистрации.
Код компонента выглядит следующим образом:
import { Component, Host, h } from '@stencil/core';
import { Build, State } from '@stencil/core';
import { AuthService } from 'auth/auth.service';
import { ConfigService } from 'common/config.service';
@Component({
tag : 'auth-guard',
styleUrl : 'auth-guard.css',
shadow : true,
})
export class AuthGuard {
@State() canRender : boolean = false;
componentWillLoad() {
if (Build.isBrowser) {
const timerId = setInterval(() => {
if (AuthService.isInitialized) {
AuthService.vol$.subscribe(_u => {
this.canRender= true;
});
clearInterval(timerId);
}
}, ConfigService.loadTime);
}
}
render() {
console.log('auth guard :: render', this.canRender, AuthService.me);
return (
<Host>
{
this.canRender ? (
AuthService.me && AuthService.me.id.length > 0 ? (
<slot></slot>
) : (
<ion-button
href="/signup"
routerDirection="forward"
color="danger">
Signup
</ion-button>
)
): null
}
</Host>
);
}
}
Теперь в другом файле я использую следующий код:
<auth-guard slot='end'>
<volunteer-mini volunteer={AuthService.me}></volunteer-mini>
</auth-guard>
С этим я ожидаю, что
- Ничего не будет отображено до тех пор, пока
this.canRender
не станет истинным. - Как только this.canRender станет истинным, если AuthService.me действителен, визуализировать слот HTML,
- Если AuthService.me имеет значение null, выполнить регистрацию button.
Но кажется, что this.canRender имеет значение false, он пытался отобразить volunteer-mini
слот HTML, что является проблемой. Поскольку volunteer-mini
внутренне зависит от AuthService.me, который еще не инициализирован.
Но как только this.canRender
становится истинным, другие 2 сценария ios работают нормально.