2017-11-15 19 views
1

問題があります。私はイオンフレームワークを使ってモバイルアプリを開発する。それは映画アプリです。 githubに関する一例を見つけ、プロジェクトにいくつかの機能とデザインを実装しようとしました。未知の型エラーは未定義のプロパティ 'touppercase'を読み取ることができませんObservable._subscribe

私は 'Store'というページを持っています。私はプロジェクトを開始するとき、私はそれはngOnInit関数から来エラー

Uncaught (in promise): TypeError: Cannot read property 'toUpperCase' of undefined TypeError: Cannot read property 'toUpperCase' of undefined at Observable._subscribe

を得るが、私は間違っているものを見ることができません。私は最近、イオンフレームワーク、ts、角度でモバイル開発を学び始めました。私はどんな助けにも喜んでいます。あなたが(ちなみにHttpと一緒に推奨されません)Requestを使用しているとき

import { Injectable } from '@angular/core'; 
import {Http, Headers, RequestMethod, Request} from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class MovieService { 

    constructor(private http:Http) { 

    } 

    searchMovies(movieName) { 
     var url = 'http://api.themoviedb.org/3/search/movie?query=&query=' + 
encodeURI(movieName) + '&api_key=xxxxxxxxxxxxxxxxxx'; 

     var response = this.http.get(url).map(res => res.json()); 
     return response; 
    } 

    send(name, id?, item?) { 

       let url: string, 
        body: any, 
        api_key: string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 

       if(name == 'getMovies') 
        url = 'http://api.themoviedb.org/3/movie/'+id+'? 
api_key=' + api_key; 
       else if (name == 'getMoviesByPage') 
        url = 'http://api.themoviedb.org/3/movie/popular? 
api_key='+api_key+'&page=' + id; 
       else if (name == 'getSingleMovie') 
        url = 'https://api.themoviedb.org/3/movie/'+id+'? 
api_key=' + api_key; 
       else if (name == 'getVideo') 
        url = 'https://api.themoviedb.org/3/movie/'+id+'/videos? 
api_key=' + api_key; 
       else if (name == 'getImages') 
        url = 'https://api.themoviedb.org/3/movie/'+id+'/images? 
api_key=' + api_key; 


       let options = { 
        url: url, 
        body: null 
       }; 

       if (item) { 
        body = typeof item === 'string' ? item : 
JSON.stringify(item); 
        options.body = body; 
       } 


       return this.http.request(new Request(options)) 
        .map(res => res.json()) 

      } 
} 
+2

私はコードのその部分が影響を受けたものではないと思います。 'toUppderCase'を呼び出す必要はありません。 –

+0

あなたのコンソールに他のものがありますか?この購読を一時的に削除しようとしましたか? –

+0

どこで 'toUpperCase'を使用しましたか?そのスニペットも追加できますか? –

答えて

0

問題がある:

import { Component } from '@angular/core'; 
import { NavController } from 'ionic-angular'; 
import { MovieService } from '../../services/movie-service'; 
import { MovieDetailsPage } from '../movie-details/movie-details'; 

@Component({ 
    selector: 'page-store', 
    templateUrl: 'store.html' 
}) 
export class StorePage { 

    movies: Array<any>; 

    constructor(public navCtrl: NavController, private movieService: 
MovieService) { 

    } 

    ngOnInit(){ 
     this.movieService.send('getMovies').subscribe(a => { 
      console.log(a); 
      this.movies = a.results.map(b => { 
       return { 
        id: b.id, 
        title: b.title, 
        image: b.poster_path, 
        overview: b.overview, 
        rating: b.vote_average 
       } 
      }) 
     }); 
    } 

    searchMovieDB(event, key) { 
     if(event.target.value.length > 2) { 
      this.movieService.searchMovies(event.target.value).subscribe(
       data => { 
        this.movies = data.results; 
        console.log(data); 
       }, 
       err => { 
        console.log(err); 
       }, 
       () => console.log('Movie Search Complete') 
      ); 
     } 
    } 

    itemTapped(event, movie) { 
     //console.log(movie); 
     this.movieService.send('getSingleMovie', movie.id).subscribe(data 
    => console.log(data)); 
     this.navCtrl.push(MovieDetailsPage, { 
      movie: movie 
     }); 
    } 

} 

は、ここで私は、APIリクエストを作成するために使用する「MovieService」です。本当に必要なものは何もありません。たとえば、idに基づいて1つのムービーを取得すると、サブムーブメント内のマッピングでアプリケーションがエラーをスローします。なぜなら、1つのムービーを取得して戻ってくるデータは、アレイ。あなたはそれを考え直す必要があります!

しかし、ここではIDに基づいて、映画一本を入手したサンプルです:

send(name, id?, item?) { 
    let url: string, 
    api_key: string = 'xxxxxxxxxxxxxxxxxxxxxxx'; 

    if (name == 'getMovies') 
    url = 'https://api.themoviedb.org/3/movie/' + id + '?api_key=' + api_key 

    return this.http.get(url) 
    .map(res => res.json()) 
} 

コンポーネント:

ngOnInit() { 
    this.movieService.send('getMovies').subscribe(a => { 
    this.movies = a // will not be an array in this case, just an object! 
    }); 
} 
+0

DEMO:https://stackblitz.com/edit/ionic-qu29r8?file=pages%2Fhome%2Fhome.ts私はあなたのAPIを使用していたので、デモをコメントとして残して、完全に削除することができますキー(ほとんどの場合は共有しないでください):) – Alex

+0

ありがとう! 違いがわかりました。 「リクエスト」を「取得」に変更しました(あなたが言ったように)、うまく機能します。 – keeroll

+0

素晴らしい!聞いてうれしい :) – Alex

関連する問題