【问题标题】:How do I use routing in an angular app with Ionic tabs?如何在带有 Ionic 选项卡的 Angular 应用程序中使用路由?
【发布时间】:2020-08-29 17:14:03
【问题描述】:

我一直在尝试使用选项卡向我的 Ionic 应用程序添加路线,但无济于事。每当我向我的路由数组添加任何路由并更新应用程序时,本地主机服务器都会返回一个空白屏幕。我也在开发者工具控制台中得到这个错误:

Comonent MessagesComponent 不是任何 NgModule 的一部分,或者该模块尚未导入到您的模块中。

这是我的应用路由模块文件:

import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { MessagesComponent } from './messages/messages.component';
import { Tab1Page } from './tab1/tab1.page';
import { TabsPage } from './tabs/tabs.page';
const routes: Routes = [
  { path: 'messages', component: MessagesComponent},
  //This is how you define routes for tabs  
  {
    path: 'tabs',
    component: TabsPage,
    children: [
      {
        path: 'tab1',
        children: [
          {
            path: '',
            loadChildren: '../tab1/tab1.module#Tab1PageModule'
          }
        ]
      },
      {
        path: '',
        redirectTo: '/tabs/tab1',
        pathMatch: 'full'
      }
    ]
  },

  {
    path: '', loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
  }
];
@NgModule({
  imports: [
    RouterModule.forRoot( routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

【问题讨论】:

    标签: angular ionic-framework routes


    【解决方案1】:

    欢迎来到 StackOverflow!

    您需要更加熟悉 Angular。错误告诉你该怎么做。您需要将消息组件导入模块的声明部分。因此,我假设您已经拥有AppRoutingModule,而您在某处还有一些app.module.ts。添加这个:

    import { NgModule } from '@angular/core'
    import { HttpClientModule } from '@angular/common/http'
    import { BrowserModule } from '@angular/platform-browser'
    import { IonicModule } from '@ionic/angular'
    
    import { AppRoutingModule } from './app-routing.module'
    import { AppComponent } from './app.component'
    import { MessagesComponent } from './messages/messages.component';  // <------
    
    @NgModule({
      bootstrap: [AppComponent],
      imports: [
        IonicModule.forRoot(),
        HttpClientModule,
        BrowserModule,
        AppRoutingModule,
        // ...
      ],
      declarations: [
        AppComponent,
        MessagesComponent, // <------
      ],
    })
    export class AppModule {}
    

    一般来说,我建议您将消息组件外包到消息模块中并像使用 TabsPageModule 一样延迟加载它,而 tab1 延迟技术已经过时了。

    现在回到标签页

    这就是它的样子:

    app-routing.module.ts

    import { NgModule } from '@angular/core'
    import { Routes, RouterModule } from '@angular/router'
    
    const defaultRout = "/tabs"
    
    const routes: Routes = [
      {
        path: 'tabs',
        loadChildren: () => import('./tabs/tabs.module').then((m) => m.TabsModule),
      },
    
      // 404
      {
        path: '**',
        redirectTo: defaultRout, // or 404 module
      },
    ]
    
    @NgModule({
      imports: [
        RouterModule.forRoot(routes),
      ],
      exports: [RouterModule],
    })
    export class AppRoutingModule {}
    

    tab-routing.module.ts

    import { NgModule } from '@angular/core'
    import { RouterModule, Routes } from '@angular/router'
    
    import { TabsComponent } from './tabs.component'
    
    const defaultRoute = "/tabs"
    
    const routes: Routes = [
      {
        path: '', // tabs
        component: TabsComponent,
        children: [
          {
            path: '',
            redirectTo: defaultRoute,
            pathMatch: 'full',
          },
    
          // Routes
          {
            path: 'explore',
            loadChildren: () => import('../explore/explore.module').then((m) => m.ExploreModule),
          },
    
          // 404
          {
            path: '**',
            redirectTo: defaultRoute,
          },
        ],
      },
    ]
    
    @NgModule({
      imports: [RouterModule.forChild(routes)],
      exports: [RouterModule],
    })
    export class TabsRoutingModule {}
    

    您在此处看到所有内容都在其自己的文件夹中并具有自己的模块。这可以防止以后出现一些问题,并使所有内容更加模块化。

    PS:你可以在 SO:```typescript 中添加语法高亮

    【讨论】:

    • 嗨。我创建了消息模块,然后将消息组件外包给它。然后我创建了通往该模块的路线。现在,当我将其提供给浏览器时,它会显示该应用程序。问题是当我尝试使用我生成的链接导航到消息组件时,我没有得到任何响应。我使用 augury 检查了我的路由,发现消息组件确实被路由到了。可能是什么问题?另外,感谢语法高亮提示。
    • 看看你在哪里设置了path 名称。在模块内部,路由模块应该是一个没有任何路由名称的入口点(参见我上面的代码),它获取默认路由。也可能是您忘记将组件添加到您要路由到的模块中。所以消息组件必须在消息模块中,而不是在 AppModule 中。
    • 嗨。我已经尝试了一切,但仍然找不到问题。该应用程序呈现但仍不路由。也许您可以通过查看 github 上的项目来帮助我找到问题...github.com/agingaRichard/zapmessenger
    • 我做了一个有效的 PR:github.com/agingaRichard/zapmessenger/pull/1
    • 我合并了你的拉取请求,但它仍然没有路由。我广泛地研究了这个项目几个星期,但仍然找不到问题。然后,我创建了一个新的 ionic 项目并创建了一个新页面,瞧!它路由成功。所以我回去并在我们试图修复的项目上创建了一个相同页面的相同路由,但它仍然没有路由! (P.S. 我确定我在创建项目时启用了路由。)
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2019-10-22
    • 1970-01-01
    • 2017-03-22
    • 2017-11-04
    • 2017-06-29
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多