簡體   English   中英

如何在ionic 4中將數據從空白頁傳遞到標簽頁

[英]how to pass data from blank page to tabs page in ionic 4

我是離子的新手。
我想將參數從一頁傳遞到標簽頁。
基本上它是一個地點列表。 單擊該項目時,我想通過 place_id 來放置標簽頁。
有 3 個選項卡:地點詳細信息、成員列表、事件。
我想將 place_id 傳遞給所有頁面。
如果我將參數傳遞給選項卡頁面,則單擊某個項目將不起作用。 但是沒有參數,它完美地工作。 它轉到標簽頁。

app-routing.module.ts

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: 'tab',
    loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
  },
  {
    path: 'member-detail',
    loadChildren: () => import('./member-detail/member-detail.module').then( m => m.MemberDetailPageModule)
  },
  {
    path: 'member-detail/:userId',
    loadChildren: () => import('./member-detail/member-detail.module').then( m => m.MemberDetailPageModule)
  },
  {
    path: '',
    loadChildren: () => import('./login/login.module').then( m => m.LoginPageModule)
  },
  {
    path: 'register',
    loadChildren: () => import('./register/register.module').then( m => m.RegisterPageModule)
  },
  {
    path: 'forgot-password',
    loadChildren: () => import('./forgot-password/forgot-password.module').then( m => m.ForgotPasswordPageModule)
  },
  {
    path: 'otp',
    loadChildren: () => import('./otp/otp.module').then( m => m.OtpPageModule)
  },
  {
    path: 'edit-profile',
    loadChildren: () => import('./edit-profile/edit-profile.module').then( m => m.EditProfilePageModule)
  },
  {
    path: 'forgot-change-password',
    loadChildren: () => import('./forgot-change-password/forgot-change-password.module').then( m => m.ForgotChangePasswordPageModule)
  },
  {
    path: 'forgot-change-password/:contact',
    loadChildren: () => import('./forgot-change-password/forgot-change-password.module').then( m => m.ForgotChangePasswordPageModule)
  },
  {
    path: 'member-list',
    loadChildren: () => import('./member-list/member-list.module').then( m => m.MemberListPageModule)
  },
  {
    path: 'places',
    loadChildren: () => import('./places/places.module').then( m => m.PlacesPageModule)
  },
  // {
  //   path: 'place-tab',
  //   loadChildren: () => import('./place-tab/place-tab.module').then( m => m.PlaceTabPageModule)
  // },
  {
    path: 'place-tab/:placeId',
    loadChildren: () => import('./place-tab/place-tab.module').then( m => m.PlaceTabPageModule)
  },
  {
    path: '',
    loadChildren: () => import('./place-tab/place-tab.module').then( m => m.PlaceTabPageModule)
  },
  {
    path: '',
    loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
  }
];
@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule {}

地方.page.ts

placeDetail(placeId: string) {
    console.log(placeId);
    this.router.navigate(['/place-tab/', placeId]);
    // this.router.navigateByUrl('/place-tab');
  }     

地方tab.page.ts

export class PlaceTabPage {
  placeId: any;
  constructor(private activatedRoute: ActivatedRoute) { 
    this.activatedRoute.params.subscribe(params => {
      this.placeId = params['placeId']; 
    });
    console.log(this.placeId);
  }
}  

place-tab-routing.module.ts

const routes: Routes = [
  {
    path: 'place-tab',
    component: PlaceTabPage,
    children: [
      {
        path: 'place-detail',
        children: [
          {
            path: '',
            loadChildren: () =>
              import('../place-detail/place-detail.module').then(m => m.PlaceDetailPageModule)
          }
        ]
      },
      {
        path: 'place-member',
        children: [
          {
            path: '',
            loadChildren: () =>
              import('../place-member/place-member.module').then(m => m.PlaceMemberPageModule)
          }
        ]
      },
      {
        path: 'place-event',
        children: [
          {
            path: '',
            loadChildren: () =>
              import('../place-event/place-event.module').then(m => m.PlaceEventPageModule)
          }
        ]
      },
      {
        path: '',
        redirectTo: '/place-tab/place-detail',
        pathMatch: 'full'
      }
    ]
  },
  {
    path: '',
    redirectTo: '/place-tab/place-detail',
    pathMatch: 'full'
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class PlaceTabPageRoutingModule { }

下面是一個示例,說明如何將數據傳遞到選項卡組件並在子選項卡的整個導航過程中保持該狀態。 這個解決方案確實感覺有點笨拙,所以如果在某個時候出現更好的答案,我不會感到驚訝。

假設我們將通過單擊按鈕從home.page.html導航到tabs.page.html 您可以向home.page.ts的函數注冊單擊事件,並在該函數中使用 Angular 的路由器導航到選項卡頁面。 這里的技巧是添加 NavigationExtras,您可以在其中添加狀態。 Angular文檔將 state 屬性定義為:

可以傳遞給任何導航的開發人員定義的狀態。 在執行導航時通過從 router.getCurrentNavigation() 返回的 Navigation.extras 對象訪問此值。

導航完成后,路由器將一個包含該值的對象與一個 navigationId 一起寫入 history.state。 在激活此路由之前調用 location.go() 或 location.replaceState() 時寫入該值。

state 屬性可以包含您想要傳遞到路由的任何內容。 html 和 ts 文件看起來像這樣

home.page.html

<ion-content>
  <ion-button (click)="routeToTabs(1)">Pass the ID of 1 to tabs pages</ion-button>
  <ion-button (click)="routeToTabs(2)">Pass the ID of 2 to tabs pages</ion-button>
  <ion-button (click)="routeToTabs(3)">Pass the ID of 3 to tabs pages</ion-button>
</ion-content>

home.page.ts

import { Router, NavigationExtras } from '@angular/router';

...
export class HomePage implements OnInit {

  constructor(private router: Router) { }

  routeToTabs(myId: any) {
    const navigationExtras: NavigationExtras = { state: { id: myId } };
    this.router.navigate(['tabs'], navigationExtras);
  }
}

一旦導航完成狀態屬性就會消失(有點 - 它被存儲在一個 history.state 屬性中)所以在tabs.page.ts構造函數中獲取傳入的數據並將其分配給這樣的局部變量

export class TabsPage implements OnInit {
  id: any;

  constructor(private router: Router) {
    const navigation = this.router.getCurrentNavigation();
    const state = navigation.extras.state;
    this.id = state.id;
  }
}

這就是感覺不太tabs.page.html的地方...在tabs.page.html向所有選項卡添加一個點擊事件,調用一個函數並將選項卡名稱傳遞給它,如下所示

<ion-tabs>

  <ion-tab-bar slot="bottom">
    <ion-tab-button tab="tab1" (click)="routeToTab('tab1')">
      <ion-icon name="triangle"></ion-icon>
      <ion-label>Tab 1</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="tab2" (click)="routeToTab('tab2')">
      <ion-icon name="ellipse"></ion-icon>
      <ion-label>Tab 2</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="tab3" (click)="routeToTab('tab3')">
      <ion-icon name="square"></ion-icon>
      <ion-label>Tab 3</ion-label>
    </ion-tab-button>
  </ion-tab-bar>

</ion-tabs>

tabs.page.ts添加將狀態添加到 NavigationExtras 並路由到選項卡的函數

routeToTab(tabRoute: string) {
    const navigationExtras: NavigationExtras = {
      state: { id: this.id }
    };
    this.router.navigate(['tabs/' + tabRoute], navigationExtras);
}

最后,在每個tab組件文件中添加構造函數,提取出state對象傳入的數據

id: any;

constructor(private router: Router) {
  const navigation = this.router.getCurrentNavigation();
  const state = navigation.extras.state
  this.id = state.id;
}

我想就是這樣。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM