gpt4 book ai didi

typescript - 属性未定义 Angular2 和 TypeScript

转载 作者:太空狗 更新时间:2023-10-29 17:38:32 26 4
gpt4 key购买 nike

我正在尝试通过使用 Angular2 模块 Http 来检索本地 json 文件的内容。

我得到的错误是一个未定义的属性,但我认为它应该在 prepareCredentials 函数被 Observable/Subscribe 调用 onComplete 时初始化。

下面是错误,

TypeError: Cannot read property 'clientId' of undefined
at SpotifyComponent.prepareCredentials (spotify.component.ts:58)
at SafeSubscriber.eval [as _complete] (spotify.component.ts:38)
at SafeSubscriber.__tryOrUnsub (Subscriber.ts:240)
at SafeSubscriber.complete (Subscriber.ts:226)
at Subscriber._complete (Subscriber.ts:142)
at Subscriber.complete (Subscriber.ts:120)
at MapSubscriber.Subscriber._complete (Subscriber.ts:142)
at MapSubscriber.Subscriber.complete (Subscriber.ts:120)
at XMLHttpRequest.onLoad (xhr_backend.ts:67)
at ZoneDelegate.invokeTask (zone.js:356)

组件,

import { Component, OnInit } from '@angular/core';
import { Http, Response } from '@angular/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

import { SpotifyService } from './spotify.service';

@Component({
moduleId: module.id,
selector: 'app-spotify',
templateUrl: 'spotify.component.html',
styleUrls: ['spotify.component.css'],
providers: [SpotifyService]
})

export class SpotifyComponent implements OnInit {
private credentialsData: {
clientId: string,
clientSecret: string
};

constructor(
private http: Http,
private spotifyService: SpotifyService
) { }

ngOnInit() {
if (this.spotifyService) {
this.http.get('../app/data/credentials.json')
.map(this.handleResponse)
.subscribe(
this.setupCredentials,
this.handleError,
() => { this.prepareCredentials(); }
);
}
}

private setupCredentials(subData) {
console.log('Setting up credentials...');
this.credentialsData = {
clientId: <string>subData.clientId,
clientSecret: <string>subData.clientSecret
};
console.log('credentials: ' +
JSON.stringify(this.credentialsData));
console.log('credentials clientId: ' + this.credentialsData.clientId);
console.log('credentials clientSecret: ' + this.credentialsData.clientSecret);
}

private prepareCredentials() {
console.log('Preparing credentials...');
this.spotifyService.prepare(
this.credentialsData.clientId,
this.credentialsData.clientSecret,
'', 'http://localhost:4200/spotify');

}

private handleResponse(res: Response) {
console.log(JSON.stringify(res.json()));
return res.json().spotify;
}

private handleError(error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg); // log to console instead
return Observable.throw(errMsg);
}

}

和服务,

import { Injectable } from '@angular/core';

@Injectable()
export class SpotifyService {
private clientId: string;
private clientSecret: string;
private scopes: string;
private callbackUrl: string;

constructor() { }

wakeUpTest(): string {
console.log('SpotifyService is awake and initiated.');
return 'SpotifyService is awake and initiated.';
}

prepare(clientId: string,
clientSecret: string,
scopes: string,
callbackUrl: string): void {
console.log(clientId);
}

getAuthCode(): void {
let authUrl: string = 'https://accounts.spotify.com/authorize' +
'?response_type=code' +
'&client_id=' + this.clientId +
'&scope=' + encodeURIComponent(this.scopes) +
'&redirect_uri=' + encodeURIComponent(this.callbackUrl);
}

}

在此先感谢您的任何帮助或指点,因为所有这些对我来说都是相对较新的。

最佳答案

我想你的问题出在这里:

this.http.get('../app/data/credentials.json')
.map(this.handleResponse)
.subscribe(
this.setupCredentials, <==
this.handleError,
() => { this.prepareCredentials(); }
);

如果你直接传递一个方法引用,这是默认的 JS/TS 行为。您可以像 this.setupCredentials.bind(this) 一样使用 bind 或使用 arrow function保留这个:

this.http.get('../app/data/credentials.json')
.map(this.handleResponse)
.subscribe(
(data) => this.setupCredentials(data),
(res) => this.handleError(res),
() => { this.prepareCredentials(); }
);

希望对你有帮助!

关于typescript - 属性未定义 Angular2 和 TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37466172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com