[解決済み] Angular2コンポーネントのthisがコールバック関数実行時に未定義になる。
2022-10-29 02:11:23
質問
RESTfulエンドポイントからデータをフェッチするサービスを呼び出すコンポーネントがあります。このサービスは、前記データをフェッチした後に実行するコールバック関数を与えられる必要があります。
問題は、コンポーネントの変数にある既存のデータにデータを追加するためにコールバック関数を使用しようとすると
EXCEPTION: TypeError: Cannot read property 'messages' of undefined
. なぜ
this
は未定義なのでしょうか?
TypeScriptのバージョンです。バージョン1.8.10
コントローラのコードです。
import {Component} from '@angular/core'
import {ApiService} from '...'
@Component({
...
})
export class MainComponent {
private messages: Array<any>;
constructor(private apiService: ApiService){}
getMessages(){
this.apiService.getMessages(gotMessages);
}
gotMessages(messagesFromApi){
messagesFromApi.forEach((m) => {
this.messages.push(m) // EXCEPTION: TypeError: Cannot read property 'messages' of undefined
})
}
}
どのように解決するのですか?
この場合 関数.prototype.bind 関数を使用します。
getMessages() {
this.apiService.getMessages(this.gotMessages.bind(this));
}
ここで起こることは
gotMessages
をコールバックとして渡すと、それが実行されるときにスコープが異なるので
this
は期待したものではありません。
は
bind
関数は、その関数にバインドされた新しい関数を返します。
this
にバインドされた新しい関数を返します。
もちろん 矢印機能 を使うこともできます。
getMessages() {
this.apiService.getMessages(messages => this.gotMessages(messages));
}
私は
bind
の構文が好きですが、それはあなた次第です。
第三の選択肢として、そもそもメソッドをバインドすることです。
export class MainComponent {
getMessages = () => {
...
}
}
または
export class MainComponent {
...
constructor(private apiService: ApiService) {
this.getMessages = this.getMessages.bind(this);
}
getMessages(){
this.apiService.getMessages(gotMessages);
}
}
関連
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み】JavaScriptの関数名を文字列で指定して実行する方法
-
[解決済み] Angular2 ngSwitchステートメントでtypescriptのenum値を使用する方法
-
[解決済み] Angular2:コンポーネントをレンダリングする前にデータをロードする方法は?
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除