Http.Get() 总是在 angular 中返回 undefined 2
Http.Get() always returning undefined in angular 2
在教程中,讲师正在使用 spotify api 构建 spotify 音乐搜索。遵循讲师所做的每一步,但问题是我的数据永远不会回来,我变得不确定并且屏幕上没有任何显示。但是,如果我直接在浏览器中点击 api,则会显示 json 数据,但不会显示在我的应用程序中。
其实我见过很多这样的问题,但是none解决了我的问题。我认为这可能是一个与网络相关的问题,但是当我设置断点时,我可以在响应中看到结果但是没有任何东西被加载到视图中,未定义被加载到控制台
**search.component.html**
<h1>Need Music?</h1>
<p class="lead">
Use the ngSpotify app to browse new releases of your favorite songs. See what your favorite artistes are up to.
</p>
<form>
<div class="form-group">
<input type="text" name="searchStr" [(ngModel)]="searchStr" (keyup.enter)="searchMusic()" class="form-control" placeholder="Search music here..."/>
</div>
</form>
**search.component.ts**
import { Component, OnInit } from '@angular/core';
import { SpotifyService } from '../../Services/spotify.service';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css']
})
export class SearchComponent implements OnInit {
constructor(private _spotifyservice: SpotifyService) { }
searchStr: string;
searchResult;
searchMusic() {
return this._spotifyservice.searchMusic(this.searchStr)
.subscribe(data => {
console.log(data);
this.searchResult = data;
},
error => {
console.log(error)
})
}
ngOnInit() {
}
}
**spotify.service.ts**
import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import { Observable } from 'rxjs/Rx'
@Injectable()
export class SpotifyService {
private searchUrl: string;
constructor(private _http: Http) { }
searchMusic(str: string, type = 'artist') {
this.searchUrl = `http://api.spotify.com/v1/search?query=${str}&offset=0&limit=20&type=${type}&market=US`
return this._http.get(this.searchUrl)
.map((res) => { res.json() })
.catch(this.handleError);
}
handleError(error: Response) {
return Observable.throw(error || 'server error');
}
}
既然你是这样映射的:
.map((res) => { res.json() })
你需要使用return
.map((res) => { return res.json() })
或仅使用:
.map(res => res.json())
DEMO
您的 [(ngModel)] 在这种情况下将不起作用,因此您需要使用 ElementRef 来引用输入文本框
<input type="text" name="searchStr" #input (keyup.enter)="searchMusic(input.value)" class="form-control" placeholder="Search music here..."/>
将您的方法修改为
searchMusic(searchStr:string) {
return this._spotifyservice.searchMusic(searchStr)
.subscribe(data => {
console.log(data);
this.searchResult = data;
},
error => {
console.log(error)
})
}
在您的组件中将元素 ref 声明为
@ViewChild('input') input: ElementRef;
在教程中,讲师正在使用 spotify api 构建 spotify 音乐搜索。遵循讲师所做的每一步,但问题是我的数据永远不会回来,我变得不确定并且屏幕上没有任何显示。但是,如果我直接在浏览器中点击 api,则会显示 json 数据,但不会显示在我的应用程序中。
其实我见过很多这样的问题,但是none解决了我的问题。我认为这可能是一个与网络相关的问题,但是当我设置断点时,我可以在响应中看到结果但是没有任何东西被加载到视图中,未定义被加载到控制台
**search.component.html**
<h1>Need Music?</h1>
<p class="lead">
Use the ngSpotify app to browse new releases of your favorite songs. See what your favorite artistes are up to.
</p>
<form>
<div class="form-group">
<input type="text" name="searchStr" [(ngModel)]="searchStr" (keyup.enter)="searchMusic()" class="form-control" placeholder="Search music here..."/>
</div>
</form>
**search.component.ts**
import { Component, OnInit } from '@angular/core';
import { SpotifyService } from '../../Services/spotify.service';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css']
})
export class SearchComponent implements OnInit {
constructor(private _spotifyservice: SpotifyService) { }
searchStr: string;
searchResult;
searchMusic() {
return this._spotifyservice.searchMusic(this.searchStr)
.subscribe(data => {
console.log(data);
this.searchResult = data;
},
error => {
console.log(error)
})
}
ngOnInit() {
}
}
**spotify.service.ts**
import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import { Observable } from 'rxjs/Rx'
@Injectable()
export class SpotifyService {
private searchUrl: string;
constructor(private _http: Http) { }
searchMusic(str: string, type = 'artist') {
this.searchUrl = `http://api.spotify.com/v1/search?query=${str}&offset=0&limit=20&type=${type}&market=US`
return this._http.get(this.searchUrl)
.map((res) => { res.json() })
.catch(this.handleError);
}
handleError(error: Response) {
return Observable.throw(error || 'server error');
}
}
既然你是这样映射的:
.map((res) => { res.json() })
你需要使用return
.map((res) => { return res.json() })
或仅使用:
.map(res => res.json())
DEMO
您的 [(ngModel)] 在这种情况下将不起作用,因此您需要使用 ElementRef 来引用输入文本框
<input type="text" name="searchStr" #input (keyup.enter)="searchMusic(input.value)" class="form-control" placeholder="Search music here..."/>
将您的方法修改为
searchMusic(searchStr:string) {
return this._spotifyservice.searchMusic(searchStr)
.subscribe(data => {
console.log(data);
this.searchResult = data;
},
error => {
console.log(error)
})
}
在您的组件中将元素 ref 声明为
@ViewChild('input') input: ElementRef;