14

a の成功関数は、内部で呼び出されているサービスのスコープに$http.putアクセスできません。thisPUT リクエストからのコールバックで、サービスのプロパティを更新する必要があります。

これは、私がサービスでやろうとしていることの簡単な例です:

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);
        });
    }
}

JS にエラーがある場合は申し訳ありませんが、主なポイントは、成功のコールバック内からサービス スコープにアクセスする方法です。

編集:この質問への答えは正しかったが、factoryジョシュとマークの両方が推奨した方法に切り替えた

4

2 に答える 2

23

私の知る限り、あなたはできません。しかし、とにかくそのようにサービスを実行しようとはしません。よりクリーンな方法は次のとおりです。

.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パターンであり、これらの場合にを使用する必要はありません。

于 2013-02-15T23:08:43.367 に答える
16

コールバック関数がサービス オブジェクトにアクセスできるように、にthat割り当てられた変数 (しばしば と呼ばれる) のクロージャを作成します。this

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

これは、 $http の代わりに $timeout を使用して示すPlunkerです。

于 2013-02-16T18:32:58.697 に答える