ある成分1コントローラコード
function Component1Controller(Service) {
this.tileData ={};
var self = this;
var promise = Service.getTileData(this.sourceUrl);
promise.then(function(data) {
self.tileData = data;
Service.getTileCount = data.length;
console.log('This is tileData : '+ Service.getTileCount);
});
};
あるService.jsコード
Service.$inject = ['$http','$q'];
function Service($http,$q) {
this.$http = $http;
this.$q = $q;
};
Service.prototype.getTileCount = 0;
Service.prototype.getTileData = function(Url){
var deferred = this.$q.defer();
this.$http.get(Url)
.success(function(response){
Service.prototype.getTileCount = response.data.length;
console.log('data length :', Service.prototype.getTileCount);
deferred.resolve(response);
});
return deferred.promise;
};
あります非同期的には、その理由は最初は0
であり、次にあるpoそれが変わるint。あなたのサービスを簡素化し、常にデータの単一のソースとなるgetTileData
メソッドで作業することをお勧めします。また、実装は簡単になるでしょう:それは「プライベート」_tileData
財産で応答タイルキャッシュする方法
function Service($http, $q) {
this._tileData = null;
this.$http = $http;
this.$q = $q;
}
Service.prototype.getTileData = function(Url) {
if (!this._tileData) {
this._tileData = this.$http.get(Url).then(function(response) {
return response.data;
}.bind(this));
}
return this._tileData;
};
注意、。この場合Service.getTileCount
で
function Component1Controller(Service) {
this.tileData = {};
var self = this;
Service.getTileData(this.sourceUrl).then(function(data) {
self.tileData = data;
console.log('This is tileData:', self.tileData.length);
});
};
function Component2Controller(Service) {
var self = this;
Service.getTileData(this.sourceUrl).then(function(data) {
console.log('tile count', data.length);
});
};
はもう必要ありません。今、あなたは常にデータが返されますgetTileData
方法あなたはそれを呼び出すに関係なくに頼ることができます。
デモ:あなたの入力のためのhttp://plnkr.co/edit/3zE6VL4emXaLRx2nCRih?p=info
感謝。私は同じアプローチを試みましたが、両方のコンポーネントサービスコールから、私はthis._tileDataをnullとして取得しています。だから私はこれを格納することができないと思う._tileDataオブジェクトの値は次回の呼び出しで再びnullになっています。だから、基本的に$ HTTPサービスを2度打っています。これは良い解決策ではありません。 – Samir
もちろん、私のソリューションのポイントは、あなたが決して複数のリクエスト(サービスキャッシュデータ)を作成しないで、どのコンポーネントからgetTileDataをリクエストしても、常に予測可能な方法でデータを取得するということです。 – dfsq
私のコードでエラーが見つかりましたが、あなたの状況に適した最新バージョンをチェックしてください。 – dfsq