问题
Here is my routing in a nativescript-angular project:
const routes: Routes = [
{
path: "",
redirectTo: "/tabs/default",
pathMatch: "full"
},
{
path: "tabs",
loadChildren: "~/app/modules/tabs/tabs.module#TabsModule"
},
{
path: "login",
loadChildren: "~/app/modules/login/login.module#LoginModule"
},
{
path: "register",
loadChildren: "~/app/modules/register/register.module#RegisterModule"
}
];
@NgModule({
imports: [NativeScriptRouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules
})],
exports: [NativeScriptRouterModule]
})
The scenario which leads to the error: First the app starts with tabs route, then I go to the login page, after that I go to register and then again I go to tabs page (and clean the history). After that if I go to login page again and get back to previous one (tabs page), the error occurs.
The error:
JS: Error: Cannot reattach ActivatedRouteSnapshot with a different number of children
JS: at setFutureSnapshotsOfActivatedRoutes (file:///data/data/org.nativescript.tns57/files/app/tns_modules/@angular/router/bundles/router.umd.js:1950:19) [angular]
JS: at setFutureSnapshotsOfActivatedRoutes (file:///data/data/org.nativescript.tns57/files/app/tns_modules/@angular/router/bundles/router.umd.js:1954:13) [angular]
JS: at createNode (file:///data/data/org.nativescript.tns57/files/app/tns_modules/@angular/router/bundles/router.umd.js:1935:17) [angular]
JS: at file:///data/data/org.nativescript.tns57/files/app/tns_modules/@angular/router/bundles/router.umd.js:1975:20 [angular]
JS: at Array.map (<anonymous>) [angular]
JS: at createOrReuseChildren (file:///data/data/org.nativescript.tns57/files/app/tns_modules/@angular/router/bundles/router.umd.js:1958:30) [angular]
JS: at createNode (file:///data/data/org...
Any idea?
回答1:
Try change the first route
{
path: "",
redirectTo: "tabs",
pathMatch: "full"
}
and set your TabsModule
like that
const routes: Routes = [
{
path: "",
redirectTo: "default",
pathMatch: "full"
},
{
path: "default",
component: YourDefaultComponent
}
...
];
UPDATE : If you get an same error, you can use AttachDetachReuseStrategy
import { ActivatedRouteSnapshot, RouteReuseStrategy, DetachedRouteHandle } from '@angular/router';
interface RouteStorageObject {
snapshot: ActivatedRouteSnapshot;
handle: DetachedRouteHandle;
}
export class CustomReuseStrategy implements RouteReuseStrategy {
handlers: { [key: string]: RouteStorageObject } = {};
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
if (!route.routeConfig) return null;
if (route.routeConfig.loadChildren) return null;
return this.handlers[route.routeConfig.path];
}
.....
}
then I make shouldDetach
function also check for loadChildren to prevent RouteReuseStrategy
save wrong ActivatedRouteSnapshot:
shouldDetach(route: ActivatedRouteSnapshot): boolean {
if (!route.routeConfig || route.routeConfig.loadChildren) {
return false;
}
return true;
}
Ofcourse, modify your AppModule
@NgModule({
imports: [...],
providers: [
{provide: RouteReuseStrategy, useClass: CustomReuseStrategy}
],
....
)}
export class AppModule {
}
回答2:
Try updating to nativescript-angular
to version 7.2.4 . The repo link that you posted is using version 7.2.3 that contains some issue with routing.
https://github.com/NativeScript/nativescript-angular/pull/1740
来源:https://stackoverflow.com/questions/56218581/angular-cannot-reattach-activatedroutesnapshot-with-a-different-number-of-childr