1

サーバーから JSON オブジェクトを取得する必要があります。以下は動作しない 2 つのバージョンです -

バージョン 1

app.service("authorization", ['$http', function($http){
  var authMap = [];
  $http.get('/authmap').success(function(data){this.authMap = data});
}]);

バージョン 2

app.service("authorization", ['$http', function($http){
  var authMap = [];
  $http.get('/authmap').success(function(data){authMap = data});

  var getAuthMap = function(){return authMap};
}]);

バージョン 1 では、サービスをコントローラーに注入し、authorization.authMap としてアクセスしています。空の [] が返されます。

バージョン 2 では、authorization.getAuthMap() としてアクセスしています。ここで、オブジェクトにそのようなメソッドが定義されていないというエラーが表示されますか?

両方の方法の何が問題になっていますか?

4

3 に答える 3

2

変数をそのサービススコープの一部にするだけです

app.service("authorization", ['$http', function($http){
    var authorizationScope = this;
    authorizationScope.authMap = [];
    $http.get('/authmap').success(function(data){authorizationScope .authMap = data});
}]);

バージョン 2

app.service("authorization", ['$http', function($http){
    var authorizationScope = this;
    authorizationScope.authMap = [];
    $http.get('/authmap').success(function(data){authorizationScope.authMap = data});

    authorizationScope.getAuthMap = function(){return authorizationScope.authMap};
}]);

そうすれば、コントローラーに注入すると、その変数または関数にアクセスできます

function myController($scope, authorization){
    authorization.authMap //this is how you would access the variable here
    authorization.getAuthMap(); //this is how you would access the function
}
于 2012-12-20T15:20:03.790 に答える
1
  1. 関数を公開する必要があります。
  2. $http は非同期呼び出しであることを理解する必要があります。修正する最も簡単な方法は、 $http promise をコントローラーに返し、そこでデータを解決することです。

そう:

app.service("authorization", ['$http', function($http){
  return {
     getAuthMap : function(){
        return $http.get('/authmap');
     }
  };
}]);

コントローラーで:

authorization.getAuthMap().then(function(data) {
    $scope.data = data;
});

データが複雑で、サービス内で処理する必要がある場合は、サービスで service $q を使用し、その promise をコントローラーに返すことができます。これにより、サービスが少し複雑になります。

app.service("authorization", ['$http', '$q', function($http, $q) {

  var authMap;

  return {
     getAuthMap : function(){
        var deferred = $q.defer();
        var promise = deferred.promise;

        promise.then(function() {
           if (!authMap) {
              $http.get('/authmap').success(function(data) {
                 var changedData = data;
                 // do sth with data
                 authMap = changedData;

                 deferred.resolve(changedData);
              });
           } else {
              deferred.resolve(authMap)
           }
        });
        return deferred.promise;
     }
  };
}]);
于 2012-12-20T12:04:47.320 に答える
1

あなたはすでに別の投稿でバージョン 1 について質問しており、そこに回答がありました: Unable to set a class var in $http callback

要約すると、success() メソッドと error() メソッドは、関数コンテキスト (つまりthis) をグローバル コンテキスト (つまり ) に設定して呼び出されwindowます。this.authMap = dataそのため、サービスではなく window.authMap にデータを保存します。(ローカル変数を定義して に設定することにより) クロージャーを作成し、thisその変数を success() 関数で使用する必要があります。

app.service("authorization", ['$http', function($http){
  this.authMap = [];
  var self = this;
  $http.get('/authmap')
     .success(function(data){
        self.authMap = data
     })
     .error(function(data, status){
        alert('Unable to authorize')
        console.log(status)
     })
}]);

バージョン 2 には 2 つの問題があります。

  1. バージョン1と同じ問題
  2. service() を使用しているため、サービス関数の本体は JavaScript コンストラクター関数である必要があります (Angular は基本的newにコンストラクター関数を呼び出してサービスをインスタンス化するため)。したがって、パブリック プロパティ (関数/メソッドを含む) を で定義する必要がありますthis
app.service("authorization", ['$http', function($http){
   this.authMap = [];
   this.getAuthMap = function(){ return this.authMap };
   var self = this;
   $http.get('/authmap')
      .success(function(data){
         self.getAuthMap = data
      })
      .error(function(data, status){
         alert('Unable to authorize')
         console.log(status)
      })
}]);

authMap を非公開にしたい場合は、代わりに factory() を使用してください。

app.factory("authorization", ['$http', function($http){
   var authMap = [];         // private data
   $http.get('/authmap')
      .success(function(data){
         authMap = data
      })
      .error(function(data, status){
         alert('Unable to authorize')
         console.log(status)
      })
   return {
      getAuthMap: function() { return authMap };
   }
}]);
于 2012-12-20T21:44:26.783 に答える