{"id":5157,"date":"2019-09-16T21:34:39","date_gmt":"2019-09-16T19:34:39","guid":{"rendered":"http:\/\/blog.via-internet.de\/?p=5157"},"modified":"2019-09-16T21:34:39","modified_gmt":"2019-09-16T19:34:39","slug":"ionic-cookbook","status":"publish","type":"post","link":"https:\/\/via-internet.de\/blog\/2019\/09\/16\/ionic-cookbook\/","title":{"rendered":"Ionic | Cookbook"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Routing and Navigation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"9e90\"><strong>Basic Angular Router configuration<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Create a routing module that is &#8216;visible&#8217; to all components in your app<\/h4>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\">With Angular CLI<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ng generate module app-routing<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\">With Ionic<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ionic start my-app blank --type=angular<\/pre>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Match URL paths to Pages\/Components<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>app-routing.modules.ts<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n    { path: '', redirectTo: '\/home', pathMatch: 'full' },\n    { path: '**', redirectTo: '\/home', pathMatch: 'full' },\n    { path: 'home',  loadChildren: '.\/home\/home.module#HomePageModule'    },\n    { path: 'list',  loadChildren: '.\/list\/list.module#ListPageModule'    },\n    { path: 'about', loadChildren: '.\/about\/about.module#AboutPageModule' }\n]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Update routing module imports and exports<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>app-routing.modules.ts<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">imports { RouterModule, Routes } from '@angular\/routes';<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@NgModule({\n    imports: [RouterModule.forRoot(routes)],\n    exports: [RouterModule]\n})<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Do not forget to import the routing module to you main app module<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>app.module<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { AppRoutingModule } from '.\/app-routing.module';<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">imports:[\n    AppRoutingModule\n]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Add a router-outlet to indicate where the pages will be rendered<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>app.component.html<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;router-outlet>&lt;\/router-outlet><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Basics<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>src\/app\/app-routing.module.ts<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n   { path: 'hello', component: HelloPage }\n];<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>app.component.html<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;router-outlet>&lt;\/router-outlet><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \/\/ Regular Route\n  { path: 'eager', component: MyComponent },\n\n  \/\/ Lazy Loaded Route (Page)\n  { path: 'lazy', loadChildren: '.\/lazy\/lazy.module#LazyPageModule' },\n\n    \/\/ Redirect\n  { path: 'here', redirectTo: 'there', pathMatch: 'full' }\n];<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-button href=\"\/hello\">Hello&lt;\/ion-button>\n&lt;a routerLink=\"\/hello\">Hello&lt;\/a><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a [routerLink]=\"['\/product',product.id]\">&lt;\/a><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2b-Navigate-Programmatically-with-the-Angular-Router\">Navigate Programmatically<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Component } from '@angular\/core';\nimport { Router } from '@angular\/router';\n\n@Component({ ... })\nexport class HomePage {\n  constructor(private router: Router) {}\n\n  go() {\n    this.router.navigateByUrl('\/animals');\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-Navigate-to-Dynamic-URLS\">Navigate to Dynamic URLS<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n  \/\/ Regular Route\n  { path: 'items\/:id', component: MyComponent },\n];<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-button href=\"\/items\/abc\">ABC&lt;\/ion-button>\n&lt;ion-button href=\"\/items\/xyz\">XYZ&lt;\/ion-button><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Passing parameter<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Passing parameter with state service<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">export class ComponentA {\n   constructor(private stateService: StateService) {}\n   goToComponentB(): void {\n        this.stateService.data = {...};\n        this.router.navigate(['\/b']);\n    }\n}\nexport class ComponentB implements OnInit {\n    constructor(private stateService: StateService) {}\n    ngOnInit(): void {\n        this.data = this.stateService.data;\n        this.stateService.data = undefined;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Passing parameter in link<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">export class ComponentA {\n   constructor(private router: Router) {}\n   \n   goToComponentB(): void {\n      this.router.navigate(['\/b'], {state: {data: {...}}});\n   }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">go() {\n   this.router.navigate(['..\/list'], { relativeTo: this.route });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Passing parameter in routerlink directive<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a [routerLink]=\u201d\/b\u201d [state]=\u201d{ data: {...}}\u201d>Go to B&lt;\/a><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Extracting the data<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The state property was added to&nbsp;<code><a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/api\/router\/Navigation\" target=\"_blank\">Navigation<\/a><\/code>&nbsp;which is available through&nbsp;<code><a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/api\/router\/Router#getcurrentnavigation\" target=\"_blank\">Router.getCurrentNavigation().extras.state<\/a><\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem is that&nbsp;<code>getCurrentNavigation&nbsp;<\/code>returns&nbsp;<code>Navigation&nbsp;<\/code>only&nbsp;<strong><em>during<\/em><\/strong>&nbsp;the navigation and returns&nbsp;<code>null&nbsp;<\/code>after the navigation ended. So the&nbsp;<code>Navigation<\/code>is no longer available in Component\u2019s B&nbsp;<code>onInit<\/code>&nbsp;lifecycle hook. We need to read the data from browser\u2019s history object:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">history.state.data<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-Extract-Data-from-Routes-with-ActivatedRoute\">Extract Data from Routes with ActivatedRoute<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When working with dynamic data, you need to extract the params from the URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, you might want to read from the database when the user navigates to&nbsp;<code>\/items\/:id<\/code>, using the ID from the route to make a query. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Angular has an&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/api\/router\/ActivatedRoute\" target=\"_blank\">ActivatedRoute<\/a>&nbsp;service that allows us to grab information from the current route as a plain object or Observable.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Component, OnInit } from '@angular\/core';\nimport { ActivatedRoute } from '@angular\/router';\n\n@Component({ ... })\nexport class ProfileComponent implements OnInit {\n\n  id: string;\n\n  constructor(private route: ActivatedRoute) {}\n\n  ngOnInit() {\n    this.id = this.route.snapshot.paramMap.get('id');\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or if we need to react to changes, we can subscribe to an Observable.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ngOnInit() {\n   this.route.paramMap.subscribe(params => {\n      this.products.forEach((p: Product) => {\n        if (p.id == params.id) {\n          this.product = p;\n        }\n      });\n    });\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ngOnInit() {\n   this.products.forEach((p: Product) => {\n      if (p.id == this.route.snapshot.params.id) {\n         this.product = p;\n      }\n   });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Migrate from Ionic X to Ionic 4 Routing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Set Root<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-button href=\"\/support\" routerDirection=\"root\"><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or in class<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">this.navCtrl.navigateRoot('\/support');\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Push<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-button href=\"\/products\/12\" routerDirection=\"forward\"><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">this.navCtrl.navigateForward('\/products\/12');<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pop<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-button href=\"\/products\" routerDirection=\"backward\"><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-back-button defaultHref=\"\/products\">&lt;\/ion-back-button><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate backwards programatically:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">this.navCtrl.navigateBack('\/products');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Routing in Tabs<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  path: 'contact',\n  outlet: 'modal',\n  component: ContactModal\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/...\/(modal:contact)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Lazy Loading<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Code Snippets<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ home.module.ts\n@NgModule({\n  imports: [\n    IonicModule,\n    RouterModule.forChild([{ path: '', component: HomePage }])\n  ],\n  declarations: [HomePage]\n})\nexport class HomePageModule {}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app.module.ts\n@NgModule({\n  declarations: [AppComponent],\n  imports: [\n    BrowserModule,\n    IonicModule.forRoot(),\n    RouterModule.forRoot([\n      { path: 'home', loadChildren: '.\/pages\/home\/home.module#HomePageModule' },\n      { path: '', redirectTo: 'home', pathMatch: 'full' }\n    ])\n  ],\n  bootstrap: [AppComponent]\n})\nexport class AppModule {}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Code Snippet<\/h4>\n\n\n\n<h5>app-routing.module.ts<\/h5>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n  { path: 'about', loadChildren: '.\/about\/about.module#AboutPageModule' },\n];<\/pre>\n\n\n\n<h5>about\/about.module.ts<\/h5>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n  { path: '', component: AboutPage },\n];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Using Guards<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Injectable({\n  providedIn: 'root'\n})\nexport class AuthGuard implements CanActivate {\n  constructor(private router: Router) {}\n\n  canActivate(\n    next: ActivatedRouteSnapshot,\n    state: RouterStateSnapshot\n  ): boolean {\n\n    const loggedIn = false; \/\/ replace with actual user auth checking logic\n\n    if (!loggedIn) {\n      this.router.navigate(['\/']);\n    }\n\n    return loggedIn;\n  }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n  { path: 'special', component: SpecialPage, canActivate: [AuthGuard] },\n];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting of Routing<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Enable tracing<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"4\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> @NgModule({\n    imports: [\n        RouterModule.forRoot(routes, \n            { enableTracing: true }\n        )],\n    exports: [RouterModule],\n})\nexport class AppRoutingModule {}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Common Errors and mistakes<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Placing global routing patterns at the front ot routing array<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"3\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n    { path: '', redirectTo: '\/home', pathMatch: 'full' },\n    { path: '**', redirectTo: '\/home', pathMatch: 'full' },\n    { path: 'home', component: HomePageComponent },\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finding the right path is a sequential process in search all entries in route[] and select the first with a matting path. So, in our wrong example, every path matches the common pattern &#8216;**&#8217;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Solution: Put this matting pattenr at the end of the routes[] array<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"4\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n    { path: '', redirectTo: '\/home', pathMatch: 'full' },\n    { path: 'home', component: HomePageComponent },\n    { path: '**', redirectTo: '\/home', pathMatch: 'full' },<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Storage<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Configuration <\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { IonicStorageModule } from '@ionic\/storage';\n\n@NgModule({\n  declarations: [\n    \/\/ ...\n  ],\n  imports: [\n    BrowserModule,\n    IonicModule.forRoot(MyApp),\n    IonicStorageModule.forRoot()\n  ],\n  bootstrap: [IonicApp],\n  entryComponents: [\n    \/\/ ...\n  ],\n  providers: [\n    \/\/ ...\n  ]\n})\nexport class AppModule {}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Finally, inject it into any of your components or pages:\n\nimport { Storage } from '@ionic\/storage';\n\nexport class MyApp {\n  constructor(private storage: Storage) {\n      storage.set('name', 'Max');\n\n      storage.get('age').then((val) => {\n          console.log('Your age is',  val);\n});\n}\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Code sample<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MyClass {\n  constructor(public storage: Storage) {}\n\n  async setData(key, value) {\n    const res = await this.storage.set(key, value);\n    console.log(res);\n  }\n\n  async getData(key) {\n    const keyVal = await this.storage.get(key);\n    console.log('Key is', keyVal);\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Storage with Capacitor <\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Plugins } from '@capacitor\/core';\n\nconst { Storage } = Plugins;\n\nasync setObject() {\n  await Storage.set({\n    key: 'user',\n    value: JSON.stringify({\n      id: 1,\n      name: 'Max'\n    })\n  });\n}\n\nasync getObject() {\n  const ret = await Storage.get({ key: 'user' });\n  const user = JSON.parse(ret.value);\n}\n\nasync setItem() {\n  await Storage.set({\n    key: 'name',\n    value: 'Max'\n  });\n}\n\nasync getItem() {\n  const value = await Storage.get({ key: 'name' });\n  console.log('Got item: ', value);\n}\n\nasync removeItem() {\n  await Storage.remove({ key: 'name' });\n}\n\nasync keys() {\n  const keys = await Storage.keys();\n  console.log('Got keys: ', keys);\n}\n\nasync clear() {\n  await Storage.clear();\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Components<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Alerts<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Code Snippets <\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">showAlert() {\n  this.alertCtrl.create({\n    message: \"Hello There\",\n    subHeader: \"I'm a subheader\"\n  }).then(alert => alert.present());\n}\n\n\/\/ Or using async\/await\n\nasync showAlert() {\n  const alert = await this.alertCtrl.create({\n    message: \"Hello There\",\n    subHeader: \"I'm a subheader\"\n  });\n\n  await alert.present();\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Local Notifications<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Plugins } from '@capacitor\/core';\nconst { LocalNotifications } = Plugins;\n\nLocalNotifications.schedule({\n  notifications: [\n    {\n      title: \"Title\",\n      body: \"Body\",\n      id: 1,\n      schedule: { at: new Date(Date.now() + 1000 * 5) },\n      sound: null,\n      attachments: null,\n      actionTypeId: \"\",\n      extra: null\n    }\n  ]\n});<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Custom Components<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Create custom component<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ ionic generate component components\/Sample\n> ng generate component components\/Sample\nCREATE src\/app\/components\/sample\/sample.component.scss (0 bytes)\nCREATE src\/app\/components\/sample\/sample.component.html (25 bytes)\nCREATE src\/app\/components\/sample\/sample.component.spec.ts (628 bytes)\nCREATE src\/app\/components\/sample\/sample.component.ts (270 bytes)\nUPDATE src\/app\/components\/components.module.ts (621 bytes)\n[OK] Generated component!\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ ionic generate module components\/Components --flat\n> ng generate module components\/Components --flat\nCREATE src\/app\/components\/components.module.ts (194 bytes)\n[OK] Generated module!\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"modify-selector-for-component-in-appcomponentssamplesamplecomponentts\">Modify selector for component in&nbsp;<code>app\/components\/sample\/sample.component.ts<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Component({\n    selector: 'c-sample',\n    templateUrl: '.\/c-sample.component.html',\n    styleUrls: [ '.\/c-sample.component.scss' ]\n})\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rename-files-for-component\">Rename files for component<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd src\/app\/components\/sample\nmv sample.component.html c-sample.component.scss\nmv sample.component.html c-sample.component.html\nmv sample.component.html c-sample.component.spec.ts\nmv sample.component.html c-sample.component.ts\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"export-created-component\">Export created component in <code>app\/components\/components.module.ts<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { NgModule } from '@angular\/core';\nimport { CommonModule } from '@angular\/common';\nimport { IonicModule } from '@ionic\/angular';\n\nimport { SampleComponent } from '.\/sample\/sample.component';\n\n@NgModule({\n    imports: [ CommonModule, IonicModule.forRoot(), ],\n    declarations: [ SampleComponent ],\n    exports: [ SampleComponent ],\n    entryComponents: [],\n})\nexport class ComponentsModule { }\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"add-page-to-display-the-component\">Add page to display the component<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ ionic generate page pages\/Sample\n> ng generate page pages\/Sample\nCREATE src\/app\/pages\/sample\/sample.module.ts (543 bytes)\nCREATE src\/app\/pages\/sample\/sample.page.scss (0 bytes)\nCREATE src\/app\/pages\/sample\/sample.page.html (133 bytes)\nCREATE src\/app\/pages\/sample\/sample.page.spec.ts (691 bytes)\nCREATE src\/app\/pages\/sample\/sample.page.ts (256 bytes)\nUPDATE src\/app\/app-routing.module.ts (539 bytes)\n[OK] Generated page!<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"add-custom-component-to-new-page-samplepagehtml\">Add custom component to new page&nbsp;<code>sample.page.html<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"2\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-content padding>\n    &lt;c-sample>&lt;\/c-sample>\n&lt;\/ion-content><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"register-components-module-in-samplemodulets\">Register components module in <code>sample.module.ts<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1,7,8,15,17\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular\/core';\nimport { CommonModule } from '@angular\/common';\nimport { FormsModule } from '@angular\/forms';\nimport { Routes, RouterModule } from '@angular\/router';\nimport { IonicModule } from '@ionic\/angular';\n\nimport { ComponentsModule } from 'src\/app\/components\/components.module';\nimport { SamplePage } from '.\/sample.page';\n\nconst routes: Routes = [ { path: '', component: SamplePage } ];\n\n@NgModule({\n    declarations: [SamplePage],\n    imports: [\n        CommonModule,  IonicModule,\n        RouterModule.forChild(routes),\n        ComponentsModule\n    ],\n    schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class SamplePageModule {}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"check-routing-in-app-routigodulests\">Check Routing in&nbsp;<code>app-routing.modules.ts<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"5\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const routes: Routes = [\n  { path: '', redirectTo: 'home', pathMatch: 'full' },\n  { path: 'home',   loadChildren: '.\/pages\/home\/home.module#HomePageModule' },\n  { path: 'list',   loadChildren: '.\/pages\/list\/list.module#ListPageModule' },\n  { path: 'sample', loadChildren: '.\/pages\/sample\/sample.module#SamplePageModule' }\n];\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"add-new-page-to-sidemenu-in-appcomponentsts\">Add new page to sidemenu in&nbsp;<code>app.components.ts<\/code><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  public appPages = [\n    { title: 'Home', url: '\/home', icon: 'home' },\n    { title: 'List', url: '\/list', icon: 'list' },\n    { title: 'Sample Component', url: '\/sample', icon: 'list' }\n  ];<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Directives<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTML Elements<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Access HTML Element from Page Class<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;div #box>&lt;\/div><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ViewChild('box', {static: false}) el_box:ElementRef;\nbox: any;\n\nconstructor() {\n    this.box = this.el_box.nativeElement;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Grabbing-Ionic-Components-with-ViewChild\">Grabbing Ionic Components with ViewChild<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s imagine we have a&nbsp;<code>HomePage<\/code>&nbsp;component that looks like this and we want to close the menu when an item is clicked.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-menu>\n&lt;\/ion-menu><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Our goal is to access the&nbsp;<code>ion-menu<\/code>&nbsp;from the TypeScript code so we can call its API methods, like&nbsp;<code>open()<\/code>&nbsp;and&nbsp;<code>close()<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Component, ViewChild } from '@angular\/core';\nimport { Menu } from '@ionic\/angular';\n\n@Component(...)\nexport class HomePage {\n\n  @ViewChild(Menu, {static: false})) menu: Menu;\n\n  onDrag() {\n    this.menu.close();\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explanation:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>{ static: false }<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you set&nbsp;<strong>static false<\/strong>, the component ALWAYS gets initialized after the view initialization in time for the&nbsp;<code>ngAfterViewInit\/ngAfterContentInit<\/code>&nbsp;callback functions.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>{ static: true}<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you set&nbsp;<strong>static true<\/strong>, the initialization will take place at the view initialization at&nbsp;<code>ngOnInit<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Shortcut-Use-Template-Variables\">Shortcut: Use Template Variables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There\u2019s actually a very convenient shortcut to using ViewChild in a component. We never have to leave the HTML by setting a template variable in Angular. In this example we reference the menu component with a hashtag and variable name&nbsp;<code>#mymenu<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-menu #mymenu>\n  &lt;ion-item (click)=\"mymenu.close()\">&lt;\/ion-item><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Grabbing-Multiple-Components-with-ViewChildren\">Grabbing Multiple Components with ViewChildren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You might also run into a situation where there are multiple components of the same type on the page, such as multiple FABs:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-fab>&lt;\/ion-fab>\n&lt;ion-fab>&lt;\/ion-fab>\n&lt;ion-fab>&lt;\/ion-fab><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ViewChildren<\/code>&nbsp;is almost the same, but it will grab all elements that match this component and return them as an Array.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Component, ViewChildren } from '@angular\/core';\nimport { Fab } from '@ionic\/angular';\n\n@Component(...)\nexport class HomePage {\n\n  @ViewChildren(Fab, {static: false})) fabs: Fab[];\n\n\n  closeFirst() {\n    this.fabs[0].close();\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now that you know about&nbsp;<code>ViewChild<\/code>, you should have no problem accessing the API methods found on Ionic\u2019s web components.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Loops in HTML Elements<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ul>\n   &lt;li *ngFor=\"let number of [0,1,2,3,4]\">\n      {{number}}\n   &lt;\/li>\n&lt;\/ul><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ul>\n  &lt;li *ngFor='#key of [1,2]'>\n    {{key}}\n  &lt;\/li>\n&lt;\/ul><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ul>\n  &lt;li *ngFor='#val of \"0123\".split(\"\")'>{{val}}&lt;\/li>\n&lt;\/ul><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ul>\n  &lt;li *ngFor='#val of counter(5) ;#i= index'>{{i}}&lt;\/li>\n&lt;\/ul>\n\nexport class AppComponent {\n  demoNumber = 5 ;\n\n  counter = Array;\n\n  numberReturn(length){\n    return new Array(length);\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Display Array<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-grid class=\"board\">\n  &lt;ion-row *ngFor=\"let r of [0,1,2]\">\n    &lt;ion-col col-4 class=\"cell\" *ngFor=\"let c of [0,1,2]\" (click)=\"handle(c+r*3)\">\n            {{squares[c+r*3]}}\n    &lt;\/ion-col>\n  &lt;\/ion-row>\n&lt;\/ion-grid><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Add function to Button click<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;ion-item (click)=\"onClick($event)\"><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">onClick(ev: any){\n\tthis.log('onClick', 'event=' + ev);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Change CSS class on click<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add handler to html element <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a class=\"btn\" (click)='toggleClass($event)'>\n    &lt;ion-icon class=\"icon\" name=\"bluetooth\">&lt;\/ion-icon>\n&lt;\/a><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Import Render2 in page.ts<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Component, OnInit, Renderer2 } from '@angular\/core';\n...\n\nconstructor(private renderer: Renderer2) { }<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Write handler to toggle class<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">toggleClass(event: any) {\n    const classname = 'active';\n\n    if (event.target.classList.contains(classname)) {\n        this.renderer.removeClass(event.target, classname);\n    } else {\n        this.renderer.addClass(event.target, classname);\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Migrating to Ionic 4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Replace Http Module with HttpClient<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Changes in  app.module.ts<\/p>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { HttpClientModule } from '@angular\/common\/http';<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@NgModule({\n    declarations: [AppComponent],\n    entryComponents: [],\n    imports: [\n        ...\n        HttpClientModule\n        ...\n    ],<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Changes in  service.ts<\/p>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Http } from '@angular\/http';<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { HttpClient } from '@angular\/common\/http';<\/pre>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">constructor(public http: Http) { }<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">constructor(public httpClient: HttpClient) { }<\/pre>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h2 class=\"has-large-font-size wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">ERROR: Unexpected end of JSON input while parsing near<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">npm cache clean --force\nnpm install -g @angular\/cli<\/pre>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Routing and Navigation Basic Angular Router configuration Create a routing module that is &#8216;visible&#8217; to all components in your app With Angular CLI With Ionic Match URL paths to Pages\/Components app-routing.modules.ts Update routing module imports and exports app-routing.modules.ts Do not forget to import the routing module to you main app module app.module Add a router-outlet to indicate where the pages will be rendered app.component.html Basics src\/app\/app-routing.module.ts app.component.html Navigate Programmatically Navigate to Dynamic URLS Passing parameter Passing parameter with state service Passing parameter in link Passing parameter in routerlink directive Extracting the data The state property was added to&nbsp;Navigation&nbsp;which is available through&nbsp;Router.getCurrentNavigation().extras.state. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":318,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[16,98,35],"tags":[],"class_list":["post-5157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cookbook","category-ionic","category-ionic-4"],"jetpack_featured_media_url":"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2016\/12\/ionic_1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/5157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/comments?post=5157"}],"version-history":[{"count":0,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/5157\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media\/318"}],"wp:attachment":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media?parent=5157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/categories?post=5157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/tags?post=5157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}