質問を開始する前に、私は既に大きな研究をしたことをお知らせしたいと思います。 。角度 "プロパティを読み取ることができません"未定義の "
私はAngularについて全く新しいことに注意してください。そして、それがどのように機能するかを学び始めました。
私はこの問題のタイトルに入力した問題があります。
私がしようとしているのは、Udemyで購入したコースに基づいて、Firebaseを使用してログインシステムを構築することです。
I、使用コードは以下の通りである:
auth.service.ts
import {Injectable} from '@angular/core';
import * as firebase from 'firebase';
@Injectable()
export class AuthService {
token: string;
// ...
singInUser (email: string, password: string) {
// login process here ...
}
// Responsible to retrieve the authenticated user token
getToken() {
return firebase
.auth()
.currentUser
.getIdToken();
}
}
データstorage.service.ts
// ... Dependencies here
@Injectable()
export class DataStorageService {
private recipeEndPoint: string = 'https://my-unique-id.firebaseio.com/recipes.json';
private recipeSubscription: Observable<any> = new Observable();
constructor (private http: Http,
private recipes: RecipeService,
private authService: AuthService) {}
// other functionality ...
getRecipes() {
const token = this.authService.getToken();
token.then (
(token: string) => {
this.recipeSubscription = this.http.get (this.recipeEndPoint + '?auth=' + token).map (
(data: Response) => {
return data.json();
}
);
// THIS PARTICULAR CODE WORKS AS EXPECTED
// WITH NO ISSUES
this.recipeSubscription.subscribe (
(data: Response) => {
console.log ('Data response: ', data);
},
(error) => {
console.log ('Error: ' + error);
}
)
}
);
// This is supposed to return an Observable to the caller
return this.recipeSubscription;
}
}
header.component .ts
// Dependencies here ...
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {
constructor(private dataStorage: DataStorageService, private recipeService: RecipeService) { }
// Other Code Here ...
onFetchData() {
let recipeSubscription = this.dataStorage.getRecipes();
// THIS RETURNS TRUE
console.log(recipeSubscription instanceof Observable);
// THIS LINE THEN RETURNS THE MESSAGE:
// ERROR TypeError: Cannot read property 'subscribe' of undefined
recipeSubscription.subscribe();
// IF I COMMENT OUT THE PREVIOUS LINE
setTimeout(
() => {
// THIS RETURNS TRUE
console.log(recipeSubscription instanceof Observable);
},
500
);
setTimeout(
() => {
// AS WELL THIS ONE RETURNS TRUE
console.log(recipeSubscription instanceof Observable);
},
1000
);
setTimeout(
() => {
// AS WELL THIS ONE RETURNS TRUE
console.log(recipeSubscription instanceof Observable);
},
1500
);
}
}
残念ながら、このコードで何が間違っているかわかりません。私が間違っていたものは誰でも見つけられますか?
注:スニペットを読みやすくするためにコードの一部を削除しました。他の部分が必要な場合は、私に相談してください。私はここでそれを提供します。
UPDATE#1
これは、問題はより具体的にあなたのコードが実行されますするため、getRecipes()
方法であるように思わheader.component.html
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">Logo Here</div>
<div class="navbar-default">
<ul class="nav navbar-nav">
<!-- Left Navigation Options -->
</ul>
<ul class="nav navbar-nav navbar-right">
<!-- Right Navigation Options -->
<li class="dropdown" appDropdown>
<a routerLink="/" class="dropdown-toggle" role="button">Manage <span class="caret"></span></a>
<ul class="dropdown-menu">
<li>
<a style="cursor: pointer;" (click)="onSaveData()">Save Data</a>
</li>
<li>
<!-- Here is where I call the onFetchData method -->
<a style="cursor: pointer;" (click)="onFetchData()">Fetch Data</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
あなたは 'header.component.ts'で' onFetchData() 'メソッドを呼び出しますどこから? – AlexWoe89
データストレージサービスでは、すでに購読しています。 –
コード '(click)=" onFetchData() "を使ってコンポーネントHTMLから' onFetchData() 'が呼び出されました –