首页 > 其他 > 详细

[Angular2 Router] Load Data Based on Angular 2 Route Params

时间:2016-09-26 17:52:53      阅读:190      评论:0      收藏:0      [点我收藏+]

You can load resource based on the url using the a combination of ActivatedRouteand Angular 2’s Http service. Since the params and Http are both streams, you can use RxJS to get the data off the param then switchMap over to an Http request using that data.

 

Hero.component.ts:

import { Component, OnInit } from @angular/core;
import {ActivatedRoute} from "@angular/router";
import {StarWarsService} from "../heros.service";
import {Observable} from "rxjs";

@Component({
  selector: app-hero,
  templateUrl: hero.component.html,
  styleUrls: [hero.component.css]
})
export class HeroComponent implements OnInit {

  hero: Observable<Object>;
  constructor(private router: ActivatedRoute, private starwarService: StarWarsService) {
    this.hero = router.params.map((p:any) => p.id)
      .switchMap( id => this.starwarService.getPersonDetail(id))
      .startWith({
        name: Loading...,
        image: ‘‘
      })
  }

  ngOnInit() {
  }

}

hero.component.html:

<div>
  <h2>{{(hero | async)?.name}}</h2>
  <img [src]="(hero | async)?.image" [alt]="(hero | async)?.name">

  <!--
    Notice that, here we use ? mark. This is not necessary if we use ‘startWith({name: ‘‘, image: ‘‘})‘
    startWith will set init value, so that hero.name / hero.image won‘t be undefined
   -->
</div>

heros.service.ts:

import {Injectable, Inject} from @angular/core;
import {STARWARS_BASE_URL} from "../shared/constance.service";
import {Http} from "@angular/http";
import "rxjs/add/operator/map";
import "rxjs/add/operator/switchMap";

@Injectable()
export class StarWarsService {

    constructor(@Inject(STARWARS_BASE_URL) private starwarUrl,
      private http: Http
    ) {}

    getPeople(){
      return this.http.get(`${this.starwarUrl}/people`)
        .map( res => res.json())
    }

    getPersonDetail(id){
      return this.http.get(`${this.starwarUrl}/people/${id}`)
        .map( res => res.json())
        .map( (hero:any) => Object.assign({}, hero, {
          image: `${this.starwarUrl}/${hero.image}`
        }))
    }
}

 

Github 

[Angular2 Router] Load Data Based on Angular 2 Route Params

原文:http://www.cnblogs.com/Answer1215/p/5909707.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!