2016-07-05 8 views
0

AngularJSフレームワークを使用するASP.NET MVCアプリケーションを作成しています。これは多言語アプリケーションであり、各言語のリソース値はデータベースに格納されます。Angular Factoryサービスを作成してASP.NETサーバーサイドキャッシュにアクセスする方法

サーバー側では、ユーザーがアプリケーションにログインしてビュー全体で使用すると、データベースからすべてのリソースがHttpRuntimeCacheにロードされます。

HttpRuntimeCacheのリソースにアクセスするために使用できるAngularJSファクトリサービスを作成します。例えば

  1. ユーザーのクリックは、ユーザーがアプリケーション(ホーム/インデックス)のルートにリダイレクトされ
  2. HttpRuntimeCacheへ
  3. ASP.NET MVCアプリケーションの負荷リソースにログインします。
  4. 角度のアプリケーションは、このサービスが呼び出されると、それはすでにロードされている場合、それは最初にチェックします
    • サービスを介してユーザーがHttpRuntimeCaceからこれらのリソースを必要とするページを表示すると、我々は値を取得します
    • 初期化されますリソースディクショナリ
    • ロードされていない場合、リソースディクショナリをJSONとして返すMVCアクションメソッドを呼び出し、サービスはそのレスポンスを使用して辞書をロードします
    • 既に読み込まれている場合、それはちょうどtに基づいて辞書から値を返します彼は、キー、このシナリオを実現するための最良の方法は何

を要求されましたか?

ここまではこれまでのものです。現在のソリューションの問題点は、辞書が読み込む前にサービスが値を返すことです。

angular.module("MyApp").factory('cacheService', ['$rootScope', '$http', function ($rootScope, $http, $q) { 
    var obj = { resourcesLoaded: false }; 

    obj.loadResourceDictionary = function() { 
     obj.resourcesLoaded = false; 

     $http.get("/MyApp/Cache/GetResourceDictionary") 
      .success(function (data) { 
       obj.resourceDictionary = data; 
       obj.resourcesLoaded = true; 
      }); 
    } 

    obj.getResourceValue = function (resourceKeyName) { 
     if (!obj.resourcesLoaded) { 
      obj.loadResourceDictionary(); 
     } 
     return obj.resourceDictionary[resourceKeyName]; 
    } 

    return obj; 
}]); 

EDIT使用例/ Wアンギュラコントローラ(我々はまた、ディレクティブで、このサービスを利用したい)に:あり

angular.module("MyApp").controller("MyAppCtrl", ['cacheService', function (cacheService) { 
    var self = this; 
    self.test = function() { 
     var value = cacheService.getResourceValue('Err_lbl_UserExist'); 
    } 
}]); 

<div ng-controller="MyAppCtrl as myAppCtrl"> 
    <button ng-click="myAppCtrl.test()">Test Angular CacheService</button> 
</div> 

答えて

0

あなたが行く:

angular.module("MyApp").factory('cacheService', ['$rootScope', '$http', function ($rootScope, $http, $q) { 
    var service = { 
    obj.getResourceValue = function() { 
     return $http.get("/MyApp/Cache/GetResourceDictionary") 
      .success(function (data) { 
       return data 
      }); 
    } 
    } 
    return service; 
}]); 

とのためにあなたのコントローラメソッド:

angular.module("MyApp").controller("MyAppCtrl", ['cacheService', function (cacheService) { 
    var self = this; 
    self.test = function() { 
     var value = null; 
     cacheService.getResourceValue().then(function (data){ 
       value = data['Err_lbl_UserExist']; 
     } 
    } 
}]); 

<div ng-controller="MyAppCtrl as myAppCtrl"> 
    <button ng-click="myAppCtrl.test()">Test Angular CacheService</button> 
</div> 

$ http.getは非同期関数なので、データが受信されるまでブロックされます。実装されていないエラーを処理するだけです。

+0

ご返信ありがとうございます。答えのコードはスレッドをブロックしません。obj.resourcesLoadedがfalseの場合、ディクショナリがロードされ、返される値が 'undefined'になるまでスレッドをブロックしません。 – thiag0

+0

このサービスがどこで使用されているのかを教えてください。 –

+0

Angularコントローラ内の使用例を使って質問を編集しました。 – thiag0

関連する問題