bluewavestudio
bluewavestudio

Reputation: 551

Passing data between pages in Ionic 2

I'm very new to Ionic and stumbled upon an issue I am having with my below code. I have a page called restaurant.html which lists the restaurants and when each of these items are clicked data is passed through (data pulled from a services file) to another page which should give the full details. However this doesn't seem to pass the details for each different restaurant. Can anyone tell me where I am going wrong?

Here are the pages.

restaurant.html

<ion-header>

  <ion-navbar color="restaurant-color">
    <button ion-button menuToggle>
      <ion-icon name="menu"></ion-icon>
    </button>
    <ion-title>Restaurants</ion-title>
  </ion-navbar>

</ion-header>


<ion-content padding class="restaurants attractions common-bg">
  <div class="card round" margin-bottom *ngFor="let restaurant of restaurants" (click)="viewRestaurant(restaurant.id)">
    <div class="card-header" [ngStyle]="{'background-image': 'url(' + restaurant.thumb + ')'}"></div>
    <div class="padding-xs">
      <h5>{{ restaurant.name }}</h5>
      <div class="rating">
        <ion-icon name="md-star" color="restaurant-color" *ngFor="let star of range(restaurant.rating)"></ion-icon>
        <ion-icon name="md-star" color="gray" *ngFor="let star of range(5 - restaurant.rating)"></ion-icon>
        <span color="gray">{{ restaurant.reviews.length }} reviews</span>
      </div>
      <span color="gray">Recommended for:</span>
      <div>
        <div class="pull-left">
          <span color="restaurant-color">{{ restaurant.scores[0].name }},</span>
          <span color="restaurant-color">{{ restaurant.scores[1].name }}</span>
        </div>
        <div class="pull-right">
          {{ restaurant.location.distance }} km
        </div>
        <div class="clear"></div>
      </div>
    </div>
  </div>
</ion-content>

and for restaurants.ts

import {Component} from "@angular/core";
import {NavController} from "ionic-angular";
import {RestaurantService} from "../../services/restaurant-service";
import {RestaurantDetailPage} from "../restaurant-detail/restaurant-detail";


@Component({
  selector: 'page-restaurants',
  templateUrl: 'restaurants.html'
})
export class RestaurantsPage {
  // list of restaurants
  public restaurants;

  constructor(public nav: NavController, public restaurantService: RestaurantService) {
    this.restaurants = restaurantService.getAll();
  }

  // view restaurant detail
  viewRestaurant(id) {
    this.nav.push(RestaurantDetailPage, {id: id})
  }

  // make array with range is n
  range(n) {
    return new Array(Math.round(n));
  }
}

Upvotes: 5

Views: 6573

Answers (3)

alchi baucha
alchi baucha

Reputation: 1040

Try with (single) quotes around your param key.

Try this on restaurants.ts

viewRestaurant(id) 
{
    this.nav.push(RestaurantDetailPage, {'id': id})
}

And in the restaurant-detail typescript:

import { NavController, NavParams} from 'ionic-angular';
export class .... {
    id: any;
    constructor(public navParams: NavParams){
        this.id = this.navParams.get('id');
        console.log(this.id);//The id that you passed must show up now.    
    }
}

I have a hunch that you want restaurant instead of an id here:

<(click)="viewRestaurant(restaurant)">

Upvotes: 2

Ahmad Aghazadeh
Ahmad Aghazadeh

Reputation: 17131

import {NavController} from 'ionic-angular';
constructor(private navController: NavController) {

this.navController.push(SecondPage, {
    param1: 'param1', param2: 'param2'
});
}

SecondPage :

constructor(private navController: NavController, private navParams: NavParams, private shareService: ShareService) {

this.parameter1 = navParams.get('param1'); 
this.parameter2 = navParams.get('param2');

}

Upvotes: 1

AishApp
AishApp

Reputation: 4162

It is because you are passing only the restaurant id as your parameter instead of the entire restaurant details.

<div class="card round" margin-bottom *ngFor="let restaurant of restaurants" (click)="viewRestaurant(restaurant)">

Modify your HTML so that you are passing the entire object data. Also send the entire data as parameter to other page on push

 viewRestaurant(restaurant) {
    this.nav.push(RestaurantDetailPage, {id: restaurant})
  }

Hope you are looking for this only

Upvotes: 1

Related Questions