2017-02-12 1 views
0

AWS S3バケットのlistObjects関数を呼び出すことでマイページが読み込まれます。これは基本的に、AWS S3で多数のオブジェクトを取得する非同期呼び出しです。サービスを使用してコントローラのスコープを更新する

この呼び出しをコントローラに入れ、次に$ scope($)を実行するとうまくいきます。非同期呼び出しが戻り、すべてのデータが処理されるときに$ apply()を実行します。

しかし、すべてのページは基本的にS3バケットにこの同じ呼び出しを行ってページを読み込む必要があるため、すべてのコントローラに同じコードを貼り付けています。

このコードをサービスに移行するのは明らかですが、サービスを通じてコン​​トローラのスコープを更新するにはどうすればよいですか?私は$ scopeを行うことができません。私のサービスで$ apply()。

サービスを呼び出したコントローラに、非同期呼び出しがコントローラの$ scope変数の処理と更新を完了したことを知らせるにはどうすればよいですか?

ありがとうございました。

答えて

2

Promisesと角度$qサービスを利用することをお勧めします。このためには、単にPromiseを返すサービス関数を作成します。あなたはあなたのコントローラでこのPromiseを待つことができ、解決されたらコントローラの$scopeに応答を割り当てることができます。私は正しいルートを使用している場合、私は、キャッシングを心配する必要はありません

var app = angular.module('demo', []); 

app.controller('demoCtrl', function(demoService) { 

    var self = this; 

    self.init = init; 
    self.list = {}; 

    init(); 

    function init() { 

    console.log("call async Service Method"); 
    demoService.getListObjects() 
     .then(function (list) { 
     console.log("received", list); 
     // Assign Response to the Scope 
     self.list = list; 
     }); 
    } 
}); 


app.service('demoService', function($q) { 
    var self = this; 

    self.getListObjects = getListObjects; 

    function getListObjects() { 
    var deferred= $q.defer(); 

    // Simulate Async Action 
    setTimeout(function() { 
     var list = {}; 
     deferred.resolve(list); 
    }, 1000); 

    return deferred.promise; 
    } 
}); 
+0

ありがとう、私はこれと一緒に遊んで、後で再度チェックします。 – MatTaNg

0

サービスメソッドからオブジェクトの配列を返し、コントローラ呼び出しメソッドで割り当てることができます。

サービス:

angular 
     .module('app') 
     .service('servS3', servS3); 

function servS3() 
{ 
    var service = { 
     gets3List = gets3List 
    }; 
    return service; 

    function gets3List(){ 
     //Write your logic and return array of s3 List 

    }; 
} 

コントローラ:キャッシュは、その後に行うことができる場合

$scope.s3ListObject = []; 

servS3.gets3List() 
.then(function(response){ 
    $scope.s3ListObject = response.data; 
}); 

また、ログイン時(のsessionStorage上)このS3Dataをキャッシュしようとするのではなく、データをロードします毎回パフォーマンスに影響を与える可能性があります。

+0

plunkr(DEVツールをご確認ください)

私は簡単なデモを作成していますか?私はデフォルトであなたのルート状態を角度キャッシュと考えました。 – MatTaNg

+0

私はデータキャッシングについて話しています。 AWS S3 Bucketのリストオブジェクトがページごとに異なる場合は、メソッドを1回だけ呼び出してセッションストレージに格納します。これにより、AWS s3バケットのリストオブジェクト関数への複数のラウンドトリップを回避できます。 – Kalyan

関連する問題