2016-07-05 8 views
1

AngaignJSでいくつかのタイプのリリース/開発環境を作成しようとしていますので、havinvを使わずにリリースを簡単に配備できるため、 ..メインアプリケーションモジュールで定数を定義し、同じモジュール内の別の定数で使用する

問題私は実際に使用している環境のタイプを知るために私のapp.jsで定数を宣言した後に未定義の変数を取得しています。

コンソールログにはエラー/ログはありません。

App.js

angular.module('App', ['ionic', 'app.controllers', 'app.services', 'ngCordova']) 
    .constant('ENVIRONMENT', 'DEV') 
    .constant('baseServiceUrl', (function() { 
    alert(this.ENVIRONMENT); //outputs: undefined 
    return (this.ENVIRONMENT == 'DEV') ? 'api-dev.azureexample.com/' : 'api-release.azureexample.com/'; 
    })()) 
    .constant('apiAcessKey', (function() { 
    return (this.ENVIRONMENT == 'DEV') ? '?key=somekeyfordev' : '?key=somekeyforrelease'; 
    })()) 
    .run(function($ionicPlatform) { 
    /** some more code **/ 

ので、任意のideias?

答えて

1

あなたは、一定の定数を定義カントが、あなたはトリックを行うためにサービスを使用することができます...ここでworking plunker.

を参照してくださいコードです:

angular.module('plunker', []) 
.constant('ENVIRONMENT', 'DEV') 
    .service('urls',function(ENVIRONMENT){ this.apiUrl = (ENVIRONMENT == 'DEV') ? 'api-dev.azureexample.com/' : 'api-release.azureexample.com/'; 
    }) 
    .controller('MainCtrl', function($scope, urls) { 
    $scope.name = urls.apiUrl; 
}); 

私のアプリはちょうどURLを表示:

<!DOCTYPE html> 
<html ng-app="plunker"> 

    <head> 
    <meta charset="utf-8" /> 
    <title>AngularJS Plunker</title> 
    <script>document.write('<base href="' + document.location + '" />');</script> 
    <link rel="stylesheet" href="style.css" /> 
    <script data-require="[email protected]" src="https://code.angularjs.org/1.4.9/angular.js" data-semver="1.4.9"></script> 
    <script src="app.js"></script> 
    </head> 

    <body ng-controller="MainCtrl"> 
    <p>Hello {{name}}!</p> 
    </body> 

</html> 

なぜ定数から定数を定義できないのですか?定数Bに依存する定数Aを作成したい場合は、Aが依存関係注入を使用してBに依存していることを角度に示す必要があります。しかし、定数は依存関係を持たないため、依存関係を定義できるサービスを代わりに使用しています。

2

constantおよびvalueサービスは定数を保持するとみなされ、依存関係は挿入できません。ここでの生命維持

.constant('baseServiceUrl', (function() { 
    alert(this.ENVIRONMENT); //outputs: undefined 
    return (this.ENVIRONMENT == 'DEV') ? 'api-dev.azureexample.com/' : 'api-release.azureexample.com/'; 
    })()) 

は、DIを利用していない、それはthis上で定義されていない限り(windowである)、this.ENVIRONMENTを持っていません。他のconstant SSを利用することが

constant sがconfigで定義する必要があります。

app.config(($provide, ENVIRONMENT) => { 
    $provide.constant('baseServiceUrl', ENVIRONMENT == 'DEV' 
    ? 'api-dev.azureexample.com/' 
    : 'api-release.azureexample.com/' 
); 
}) 

baseServiceUrlapiAcessKeyは明らかに、実行フェーズで使用されることが予想されているので、代わりにfactoryサービスとしてそれらを定義することが適切です:

app.factory('baseServiceUrl', (ENVIRONMENT) => { 
    return ENVIRONMENT == 'DEV' 
    ? 'api-dev.azureexample.com/' 
    : 'api-release.azureexample.com/'; 
}) 
関連する問題