В моем приложении я хочу, чтобы пользователь видел эту страницу запуска/приветствия при запуске приложения, а затем нажимал на нее кнопку, чтобы войти в систему и продолжить использование приложения… и в следующий раз, когда он открывает приложение, приложение не показывает запуск экрана и переходит прямо к входу в систему или домашнему экрану... Я сделал службу хранения, которая сохраняет состояние, если страница была просмотрена, и защиту страницы, которая перенаправляется в зависимости от состояния...
Но теперь у меня проблема, что мое приложение постоянно пропускает стартовую страницу и переходит прямо к входу в систему, и когда я пытаюсь войти, оно остается на этой странице… console.info показывает, что состояние установлено на «готово»…
вот мой код, если кто-нибудь может понять, что я сделал не так...
приложение-routing.module.ts:
const routes: Routes = [
{
path: 'login',
loadChildren: () => import('./login/login.module').then( m => m.LoginPageModule),
canLoad: [AutoLoginGuard]
},
{
path: '',
redirectTo: 'startup',
pathMatch: 'full'
},
{
path: 'startup',
loadChildren: () => import('./pages/startup/startup.module').then( m => m.StartupPageModule),
canActivate:[FirstLoadGuard]
},
{
path: 'home',
loadChildren: () => import('./home/home.module').then( m => m.HomePageModule),
canLoad: [AuthGuard],
},
];
это код storage.service.ts:
export class StorageService {
constructor(private storage: Storage) {
this.initStorage();
console.info('Init storage');
}
async initStorage() {
await this.storage.create();
console.info('Storage ustvarjen');
}
async setValue(key,value) {
await this.storage.set(key, value);
return true;
}
async getValue(key) {
return await this.storage.get(key);
}
}
это первая загрузка.guard.ts:
export class FirstLoadGuard implements CanActivate {
constructor(
private storageService: StorageService,
private router: Router
) {}
canActivate(route: ActivatedRouteSnapshot): Promise<boolean>
{
return new Promise(resolve => {
this.storageService.getValue('first_time').then((value) => {
if (value !== null) {
this.router.navigateByUrl('/login');
console.info('guard if value: ', value);
resolve(false);
}
else {
this.storageService.setValue('first_time', 'done');
resolve(true);
}
});
});
}
}
Если мне нужно предоставить больше кода, не стесняйтесь комментировать ниже, и я добавлю больше... Я действительно не знаю, где моя ошибка :(
Из того, что вы сказали, это должно быть так же просто, как написать запись в локальное хранилище после того, как пользователь войдет в систему, и как только он выполнит вашу логику, вы сможете выбрать следующее представление на основе этой записи.
какую версию углового вы используете?
@Cuzy Я хочу, чтобы экран запуска отображался до того, как пользователь войдет в систему ...
@weinde Ну, на самом деле это то же самое, вы пишете запись в localStorage
, когда пользователь впервые заходит на страницу, и на основе этого вы можете перенаправить его при следующем посещении страницы.
@Cuzy вот ссылка на stackblitz stackblitz.com/edit/angular-valxtn?file=src/app/app.module.ts
Вы можете использовать canMatch для проверки того же патча, и вам не нужно делать перенаправления
{
path: '',
redirectTo: 'home',
pathMatch: 'full'
},
{
path: 'home',
loadChildren: () => import('./pages/startup/startup.module').then( m => m.StartupPageModule),
canMatch: [() => localStorage.getItem('first_time') === null],
},
{
path: 'home',
loadChildren: () => import('./home/home.module').then( m => m.HomePageModule),
canLoad: [AuthGuard],
},
Спасибо, это вызывает у меня проблему: когда я загружаю приложение, стартовая страница отображается в течение нескольких секунд, и она автоматически перенаправляется на домашнюю страницу, я хочу, чтобы она оставалась на этой странице, пока пользователь не нажмет кнопку на ней.
@weinde, у тебя есть редирект в ./pages/startup/startup.module
@weinde добавьте RouterModule.forRoot(..., { enableTracing: true })
, чтобы увидеть, откуда идет перенаправление
Нет, не знаю... может быть, страница автоматически перенаправляется после установки состояния?
canMatch проверяет только триггерную навигацию
Итак, я добавил этот код в RouterModule... какую часть я скопировал, чтобы вы могли увидеть? теперь в консоли много сообщений...
может быть что-то не так с другой частью моего кода? так как после того, как значение установлено в хранилище, и если я вернусь к /startup в адресной строке, страница останется там... что противоположно тому, что я хочу
Неважно. Я понял это :) У меня была переадресация в каком-то другом файле ... ваш ответ сработал, и я принимаю его :) Большое вам спасибо :) Если бы я мог сейчас пригласить вас на пиво :)
Хотя, когда я закрываю приложение на своем телефоне и запускаю его снова, я все еще вижу стартовую страницу...
@weinde попробуй реализовать runGuardsAndResolvers
Действительно, было бы полезно, если бы вы могли предоставить минимальный воспроизводимый пример в онлайн-редакторе кода, таком как Stackblitz