2017-03-09 80 views
0

我是Angular的新手,试图构建一个电影应用程序。如何显示本地Json文件中的数据?

我想从我的本地机器上的JSON文件中获取数据。我可以在MovieListComponent中显示来自JSON文件的所有电影。但是,当用户点击特定电影的视图细节时,我无法在MovieDetail组件中显示数据。

MovieListComponent.ts

import {Component ,OnInit} from '@angular/core'; 
 
import {MovieService} from '../services/movie.service'; 
 
import {Router} from '@angular/router'; 
 
import {Movie} from '../movie'; 
 
@Component({ 
 
    moduleId:module.id, 
 
    templateUrl: 'search.html', 
 
}) 
 
export class MovieListComponent implements OnInit { 
 
    movies:Movie[]; 
 
    constructor(
 
       private _movieservice:MovieService, 
 
       private router:Router){ 
 
       } 
 
    getMovies():void{ 
 
    this._movieservice.getMovies().then(movies => this.movies = movies); 
 
    } 
 
    ngOnInit(){ 
 
    this.getMovies(); 
 
    } 
 
    onSelect(movie:Movie):void{ 
 
    this.router.navigate(['/movies',movie.id]); 
 
    console.log(movie.title); 
 
    } 
 
}

MovieDetailComponent.ts

import {Component,OnInit} from '@angular/core'; 
 
import {ActivatedRoute,Params} from '@angular/router'; 
 
import {Location} from '@angular/common'; 
 
import 'rxjs/add/operator/switchMap'; 
 
import {MovieService} from '../services/movie.service'; 
 
import {Movie} from '../movie'; 
 

 
@Component({ 
 
    template:`<div *ngIf="movie"> 
 
       {{movie.title}} 
 
       <h4>You're seleted departmentId is = {{movie.id}} </h4> 
 
      </div>` 
 
}) 
 

 
export class ViewDetailComponent implements OnInit{ 
 

 
    movie:Movie; 
 

 
    constructor(
 
    private route:ActivatedRoute, 
 
    private movieservice:MovieService, 
 
    private location:Location){} 
 

 
    ngOnInit():void{ 
 
    this.route.params 
 
    .switchMap((params:Params) => this.movieservice.getMovie(+params['id'])) 
 
    .subscribe(movie => this.movie = movie);  
 
    } 
 
}

MovieService.ts

import{Injectable} from '@angular/core'; 
 
import {Http} from '@angular/http'; 
 
import {Movie} from '../movie'; 
 
import 'rxjs/add/operator/toPromise'; 
 

 
@Injectable() 
 
export class MovieService{ 
 
    private movieUrl = './app/movies.json'; 
 
    constructor(private _http:Http){ 
 
     console.log('Movie Service up and running'); 
 
    } 
 
    getMovies():Promise<Movie[]>{  
 
     return this._http.get(this.movieUrl) 
 
     .toPromise().then(res => res.json() as Movie[]); 
 
     //.map(res => res.json()); 
 
    } 
 
    getMovie(id: number):Promise<Movie>{ 
 
     // const url = `${this.movieUrl}/${id}`; 
 
     return this._http.get(this.movieUrl) 
 
     .toPromise().then(res => res.json() as Movie) 
 
    } 
 
}

+0

这可能会帮助你。 http://stackoverflow.com/questions/42620548/angular2-how-to-use-json-data-in-service-ts?rq=1 – amansoni211

回答

0

您的问题是,你是铸造movies.json到一个单一的电影:

getMovie(id: number):Promise<Movie[]>{ 
    return this._http.get(this.movieUrl) 
    .toPromise().then(res => res.json() as Movie[] /* Error here */) 
} 

相反,你需要要么得到一部电影,或搜索电影并返回给定ID的单个电影:

getMovie(id: number):Observable<Movie>{ 
    return this._http.get(this.movieUrl) 
     .map(response => { return <Movie>(<Movie[]>response.json()) 
     .find((item: Movie) => item.id == id)); 
} 
+0

我试过但得到一个错误'[ts]财产'发现'不存在于类型'Promise '上。 ' –

+0

已更新,以移除.toPromise。您不需要它,.get返回一个可观察对象,并查找返回单个电影。我将签名更改为Observable 。我还建议您使用开发人员工具开发控制台选项卡,您将看到您收到的错误。 –

+0

我已经从rxjs/Rx导入了observable,但是我在控制台'this._http.get(...)。subscribe(...)。中找到以下错误。find不是一个函数' –

5

如果您使用的是Angular-CLI,则需要将json文件添加到资产文件夹。然后从那里参考。

如果没有,您必须确保您的Web服务器正在提供json文件并从那里使用。

+0

解决了我的问题,谢谢! – user7518s

+0

如果您想为资产文件夹以外的文件提供服务,则可以将该文件夹放在src文件夹中,并在.angular-cli.json文件 –

+0

中的资产列表中输入相同的条目。 ;) – Verri