在我正在开发的应用程序中,它完全需要桌面和移动设备的两个不同的视图。不可能使用CSS作为内容完全不同。
我做了什么?
我已经检查了使用代码const isMobile = window.innerWidth < 768;
Routing file
中是否是台式机/移动设备和路径组件: component: isMobile ? MobileComponent : DesktopComponent
这在开发环境中正常工作。但是,当生产构建时,这会失败ng serve --prod
(显然是Angular 5)
问题:
根本没有错误,根据isMobile
是正确的/错误,它应该加载MobileComponent/DesktopComponent。但是,即使Ismobile为True/false
始终将MobileComponent加载到两个台式机中&amp;移动的。当isMobile
值正确计算时,true
的CC_7和false
的CC_9
我认为原因是在发送给客户之前已经汇编了路线。
锻炼方法尝试但无法正常工作:
在计算isMobile
并给出该变量(组件)的同时,使用了一个if..else条件
任何方法:
有什么办法可以使用相同的功能?
预先感谢
正如我在问题评论部分中所说的那样,路线警卫将是一个很好的解决方案。
MobileGuard
看起来像这样:
export class MobileGuard implements CanActivate {
constructor(private _router: Router, private _mobileService: MobileService) {}
canActivate(): boolean {
const isMobile = this._mobileService.isMobile();
if(!isMobile) {
this._router.navigate(['/desktop']);
}
return isMobile;
}
}
DesktopGuard
。
试图访问任何路线的用户将被重定向到正确的路线。
这是一个建议的解决方案的运行示例。
这是Stackblitz可编辑版本。
不要使用Canactivate或Route Guards,因为它们需要用于身份验证等。
新方法:
{
path: 'your-path',
loadChildren: () => {
if(window.innerWidth > 768 ) {
return import('./your-desktop.module').then(m => m.YourDesktopModule)
} else {
return import('./your-mobile.module').then(m => m.YourMobileModule)
}
}
}
我同意@carbondry的观点,即在routingModule中使用逻辑是最好的方法。但是,我认为使用窗口尺寸是一种检测设备类型的糟糕方法。当然,这取决于用例 - 如果您只需要显示不同的小屏幕UI,则window.innerWidth
会做到。如果您想要手机的单独功能,那可能还不够。
有多种检查设备类型的方法,例如,您可以使用navigator.orientation === undefined
检查设备是否为桌面(因为台式机不支持navigator.orientation
。
最后,您始终可以使用UserAgent
检测。为此,请参阅此线程https://stackoverflow.com/a/13819253/87775880
所以最后,您的代码可能看起来像
const isDesktop(): boolean => {
return navigator.orientation === undefined;
}
{
path: 'path',
loadChildren: () => {
if(isDesktop())
return import('./desktop.module').then((m) => m.DesktopModule);
return import('./mobile.module').then((m) => m.MobileModule);
}
}
编辑但是请记住,当第一次加载路径时,loadChildren
只能运行一次。因此,您可能需要考虑简单地检查屏幕尺寸。假设768px
在电话上可用于肖像,但是如果我以景观模式打开网站怎么办?在某些情况下,即使是景观模式也需要移动UI。但是,如果您只检查客户端宽度,则会获得桌面版本。
直接在这样的路线上进行更改 -
const routes: Routes = [{
path: '',
component: window.screen.width > 767 ? WelcomeDesktopComponent : WelcomeMobileComponent
}];