2013-08-15 12 views
9

私はtypescriptとangular.jsを使い慣れています。私はhttp getリクエストで苦労しています。 角度の型定義にDefinitelyTypedを使用しています。TypeScript/angularJS HTTP GETリクエストの範囲

私のコントローラのコードは次のようになります。

module game.Controller { 
    'use strict'; 

    export interface IGameScope extends ng.IScope { 
     vm: GameCtrl; 
    } 

    export class GameCtrl { 

     private bonus: any; 
     private http: any; 

     constructor($scope: IGameScope, $http: ng.IHttpService, $location: ng.ILocationService) { 
      $scope.vm = this; 
      this.http = $http; 
     } 

     doBet() { 
      this.http.get('http://localhost:9000/db').success(function(data: any, status: any) { 
        this.bonus = data; 
       } 
      ); 
     } 
    } 

} 

と、このような私の意見:私はhttpリクエストなしでボーナス変数を変更したとき

<button ng-click="vm.doBet()">bet</button> 
<div><span>bonus: {{ vm.bonus }}</span></div> 

ビュー・モデルバインディングは、正常に動作します。私はget要求の成功関数のボーナス変数を更新しようとすると、しかし、私はエラーを取得以下:

TypeError: Cannot set property 'bonus' of undefined 

をどのように私は成功関数の変数を更新するために達成することができますか?リクエストthis.bonus = data;

答えて

10

これは簡単に活字体のラムダ式を使用して行うことができます。

doBet() { 
    this.http.get('http://localhost:9000/db').success(
     (data, status) => this.bonus = data 
    ); 
} 
+0

このトピックについてさらに説明していますか?例えば。なぜここでラムダ式を使わなければならないのですか?通常のjsでは – Thomas

+4

となります。 'this'は成功関数では表示されません。 'this'は成功関数(data、status){...});'上記のようなlamba式は自動的に 'var _this = this;'にコンパイルされます。 this.http.get( 'url')。成功(関数(データ、ステータス){_これ。メンバー= "何か"; }); 'のように、' this'はヘルパ変数 '_this'を通してスコープ内で可視になります。助けてくれることを望む。 – 3x14159265

1

this上のデータを更新するためのより良い/きれいな方法や練習があるかどう

また、私は実際にsuccessの内側にコールバック関数を指し、任意の提案をいただければ幸いです。

代わりに、あなたはこのように行うことができます:$scope.vm.bonus = data;

+0

の$ scope'はコンストラクタではなく 'doBet()'関数にのみ表示されます 'ので、これは、動作しません。 – 3x14159265

+1

@ 3x14159265あなたのコンストラクタに 'doBet()'を移動し、 '$ scope':' $ scope.doBet = function(){...}; 'のメソッドとして宣言するか、' $ scope'を ' doBet() ' –

+0

@ 3x14159265 2つのオプションのうち、私はコントローラ内で 'doBet'を動かし、スコープ上で宣言することが望ましいでしょう。 – AlwaysALearner

1

あなたはこのような$の範囲にアクセスするために、コンストラクタにメソッドを置くことができます:ここでは

constructor($scope: IGameScope, $http: ng.IHttpService, $location: ng.ILocationService) { 
    $scope.vm = this; 
    this.http = $http; 

    $scope.doBet = function() { 
     this.http.get('http://localhost:9000/db').success(function (data: any, status: any) { 
      $scope.bonus = data; 
     }); 
    } 
} 

は活字体でAngularJSの使用に関するtutorialです。

+0

ありがとう、私はすでにこのチュートリアルを読んでいます。しかし、コントローラー内のすべてのスコープ機能を定義することが、実際にはベストプラクティスですか?さらに、私は '$ scope.vm'変数を自分のコントローラインスタンスにバインドして、すべての単一スコープ変数をコントローラ変数にバインドする必要性を排除します。この場合、IMHOでは、 '$ scope.vm = this; 'というバインディングを使用することで拡張はありません。 – 3x14159265

+0

@ 3x14159265 TypeScriptを使用するのは本当に殺しすぎると思うので、JavaScriptが複雑になります。 – zsong

1

私はtypescriptを使用していませんが、私にはクロージャ/スコープの問題のようです。成功のコールバックは非同期で実行されているので、thisの値は内部で異なります。関数呼び出しをthisでバインドしてみてください。

this.http.get('http://localhost:9000/db').success(angular.bind(this, 
    function(data: any, status: any) {this.bonus = data;}); 
+0

これはタイプスクリプトでは必要ありません。 3x14159265の回答を参照してください。 – rob

関連する問題