1

私のアプリケーションには、アプリケーションの起動時にいくつかの設定値が必要です。コミュニティからの提案は、それらを別のモジュールとして、できれば別の .js ファイルに定数として保存することです。これは私にとってはうまくいくかもしれません。
ただし、構成値もサーバーに保存されており、クライアント側でそれらを複製したくないため、サーバー呼び出しを行ってそれらを取得することを考えていました。
モジュールの構成メソッドでサーバーを呼び出すことは有効な設計慣行ですか? はいの場合、サーバーから値を取得するために $http サービスを使用する必要がありますか?

    var main = angular.module('myapp', ['AdalAngular']);

    main.config(['$stateProvider',$httpProvider, adalAuthenticationServiceProvider', function ($stateProvider,$httpProvider,adalProvider) {

        // $stateProvider configuration goes here

        // ?????CAN I make server call here to get configuration values for adalProvider.init method below???

        adalProvider.init(
            {
                instance: 'someurl', 
                tenant: 'tenantid',
                clientId: 'clientid',
                extraQueryParameter: 'someparameter',
                cacheLocation: 'localStorage',
            },
            $httpProvider
            );

    }]);

    main.run(["$rootScope", "$state", .....
        function ($rootScope, $state,.....) {

            // application start logic

        }]);


    main.factory("API", ["$http", "$rootScope", function ($http, $rootScope) {

        // API service that makes server call to get data

    }]);

編集1

したがって、以下の提案に基づいて、一定のアプローチを宣言します。基本的に、個別の config.js ファイルを用意し、デプロイ プロセス中に config.js ファイルをそれぞれの環境ベースの config.js ファイルで上書きします。

質問
10 個の定数が必要な場合は、それらを個別に module.config() に渡す必要があります。定数値をJSONオブジェクトとして宣言し、何らかの方法で構成関数で読み取ることは可能ですか?10個の異なるパラメータを渡す必要はありませんか?

angular.module('myconfig', [])
            .constant('CONFIGOBJECT','{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}');

次に、config メソッドで値を読み取るにはどうすればよいですか?

var main = angular.module('myapp',['myconfig']);
main.config(['CONFIGOBJECT',function(CONFIGOBJECT){

 ?? How do I read CONFIGOBJECT value that is a string not json object?

})
4

3 に答える 3

3

少し前に取り組んでいたプロジェクトで使用されているソリューションについて説明します。

構成段階でサービスを使用できないことは事実です。また、構成段階でプロバイダーと定数を使用できることも事実です。そこで、次の解決策を使用しました。最初に、次のような構成で単純なオブジェクトを作成しました

var config = {
    someConfig1: true,
    someConfig2: false,
    someConfigEvents: {
        event1: 'eventConfig1',
        event2: 'eventConfig2'
    }
    etc...
}

次に、jQuery lib で angular 値も宣言しました。

app.value('jQuery', jQuery);

$http のようなサービスは使用できませんが、jQuery は使用できるので、構成サーバーに ajax 呼び出しを行い、構成を拡張するだけです。

jQuery.ajax("path/to/config", { async: false, cache: false })
   .done(function (data) {
      var response = angular.fromJson(data)
      if (response) {
         angular.extend(config, response.returnData.data);
      } else {
         alert('error');
      }
   })
   .fail(function () {
      alertError();
   })
   .always(function () {
      appInit();
   });
于 2016-04-20T16:16:14.383 に答える
2

構成フェーズでは、サービスではなくプロバイダーのみを使用できます。したがって、このフェーズでは $http を使用できません。

ただし、実行フェーズ中 ( に渡される関数内run()) で使用できます。

別の方法として、JavaScript ファイルをサーバーによって動的に生成し、必要な定数を定義することもできます。

もう 1 つの方法は、サーバー側コードによって読み取られるファイルに基づいて、ビルド中にそのような JS ファイルを生成することです。

于 2016-04-20T15:55:14.090 に答える
2

セクションにサービスを挿入することはできません。セクションにサービスを挿入でき ます。 config
run

そのため、たとえば$httpservice を使用してサーバー内からデータを取得することはできませんが、プロバイダーのサービスを初期化するconfig()in inside を使用することはできます。run()

こちらのより完全な回答も参照してください。

お役に立てれば。

更新

なぜstringですか?単に使用しないのはなぜですか

.constant('CONFIGOBJECT', {Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}

為に

.constant('CONFIGOBJECT', '{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}'

?

于 2016-04-20T15:56:49.477 に答える