2013-02-15 4 views
13

成功機能は、それが内部と呼ばれていたサービスのthis範囲にアクセスすることはできません。 PUTリクエストからコールバックのサービスのプロパティを更新する必要があります。

これは私がサービスで何をしようとしているの削減例です:JSに多少の誤差がある場合

var myApp = angular.module('myApp', function($routeProvider) { 
// route provider stuff 
}).service('CatalogueService', function($rootScope, $http) { 
    // create an array as part of my catalogue 
    this.items = []; 

    // make a call to get some data for the catalogue 
    this.add = function(id) { 
     $http.put(
      $rootScope.apiURL, 
      {id:id} 
     ).success(function(data,status,headers,config) { 
      // on success push the data to the catalogue 
      // when I try to access "this" - it treats it as the window 
      this.items.push(data); 
     }).success(function(data,status,headers,config) { 
      alert(data); 
     }); 
    } 
} 

申し訳ありませんが、主なポイントは、私はサービスの適用範囲へのアクセス方法です成功コールバックの中から?

EDIT:この質問への答えが正しかった一方でジョシュとマークの両方が、私の知る限りでは、それを

答えて

15

変数の上にクロージャを作成します(多くの場合thatと呼ばれる)あなたのコールバック関数は、あなたのサービスオブジェクトにアクセスする必要がありますようにthisに割り当てられている。ここで

app.service('CatalogueService', function($rootScope, $http) { 
    var that = this; 
    ... 
     ).success(function(data,status,headers,config) { 
      that.items.push(data); 

は$タイムアウトを使用していますPlunkerの代わりでありますデモンストレーションする$ http。

+4

私はまだファクトリメソッドがこの場合には良いと思っていますが、実際に質問に答えるために+1します。 :-) –

+0

@ジョシュ、私は工場も好む。 –

+0

私は工場の回答に行くつもりですが、質問に答えたので、これを正しい回答として選択する必要があるように感じます。私はあなたの質問@JoshDavidMiller –

23

を推奨されているように、私はあなたができない、factory方法に切り替えます。しかし、私はとにかくその方法でサービスを実行しようとはしません。ここでクリーンな方法は次のとおりです。

.factory('CatalogueService', function($rootScope, $http) { 
    // We first define a private API for our service. 

    // Private vars. 
    var items = []; 

    // Private methods. 
    function add(id) { 
    $http.put($rootScope.apiURL, {id:id}) 
    .success(function(data,status,headers,config) { items.push(data); }) 
    .then(function(response) { console.log(response.data); }); 
    } 

    function store(obj) { 
    // do stuff 
    } 

    function remove(obj) { 
    // do stuff 
    } 

    // We now return a public API for our service. 
    return { 
    add: add, 
    store: store, 
    rm: remove 
    }; 
}; 

これはAngularJSでサービスを展開する非常に一般的なパターンであり、これらの場合にthisのいずれかを使用する必要はありません。

+0

私はサービスと工場の違いを理解しようとしているが、私は工場は '自分自身をreturn'になっていたと思った、とサービスはありませんでした:http://stackoverflow.com/questions/13762228/confused-サービス-VS-工場 –

+0

私はコピーしてあなたのコードを貼り付け、私は.factory' 'にそれを変更するのを忘れました。私は答えを更新しました。サービスは、いくつかのモジュール方法の1つを使用して作成されます。 'factory'はあなたが望むものを返し、' service'はプロバイダーによって実行されるコンストラクターだけを取ります。これは新しいオブジェクトを返します。 JavaScriptの魔術に頼ることなく、 'factory'を使って非同期操作の結果を保存したいと思うでしょう。 –

+0

[OK]を、ので、私は上記の概説yo've何やっによって 'items'問題になってきましたが、今私は、成功コールバックの工場とは別のメソッドを呼び出そうと同じ問題を取得しています。私はいくつかのデータをダウンロードしています。ダウンロードが成功したら、 'store()'メソッドを呼び出してそれをlocalStorageに書きたいと思っています。あなたのコード例では、例えば 'get()'メソッドを呼び出すようなものです。 –

関連する問題