あなたはすでに別の投稿でバージョン 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と同じ問題
- 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 };
}
}]);