2014-04-09 95 views
9

常數我已經寫在angularJS模塊封裝所有後端通信。爲了獲得更大的靈活性,我將api前綴作爲模塊上的一個常量值(可以是值,因爲我沒有在配置階段使用它)。 所以像最好的方法/在angularJS

angular.module('myapp.data').constant('apiPrefix', '/api/data'); 

現在我想使用這個模塊從兩個不同的應用程序。一個使用/ api1 /數據和另一個/ api2 /數據,我想在應用程序的配置階段更改它。 我知道該怎麼做,與供應商,但有一個供應商持有價值似乎像矯枉過正我。我可以從應用程序配置階段修改使用的模塊常量或值嗎?

類似:

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     console.log(apiPrefix); 
     return apiPrefix; 
    } 
    } 
}); 


angular.module("myApp",['data']) 
.config(['apiPrefix', function(prefix){ 
    prefix = 'https:/api/data'; 
}]) 
.controller("Example", function($scope, display) { 
    $scope.prefix = display.pref; 
}); 
+1

不知道,但你可以嘗試在'run'階段去做。 – Chandermani

+0

是的,你可以在運行階段更新一個值,並且你可以在配置中注入一個常量,但由於它是一個常量,所以不能更改http://stackoverflow.com/questions/13035568/angular-js-value-not -injected-in-config – shaunhusain

+0

那麼你所說的是它應該是一個值而不是常量,並在應用程序的運行階段修改它而不是配置? – masimplo

回答

10

覆蓋模塊值,可以重新定義在後面的模塊的角度值。我相信它不應該做模塊配置時間。

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('Display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     return apiPrefix; 
    } 
    } 
}); 




angular.module('myapp', ['data']) 
    .value('apiPrefix', '/api2/data') 
    .controller('MainCtrl', function($scope, Display) { 
     $scope.name = Display.pref(); 
    }); 

看到這裏的plunker: http://plnkr.co/edit/k806WE

同樣的事情適用於角常數也。

+2

偉大的解決方案。我有點不滿,我不知道,因爲我可能無意中重寫模塊常量或值,因爲我使用它們很多。好東西,我總是試圖創造獨特的描述性名稱。 – masimplo

+0

謝謝@ mxa055。實際上,我更喜歡將配置或後端api端點等常數和值保存在單獨的配置模塊中。 – khanmizan

1

角模塊,控制器等可以包含函數中,if語句等,它們不必是在頂層。所以,你可以在你的代碼中包含這個:

if (environmentOne()) { 
    module.value('apiPrefix','api1/data'); 
} else { 
    module.value('apiPrefix','api2/data'); 
} 

希望有幫助!

+0

這聽起來很有趣,但我不願意在我的模塊中爲每個可能使用我的應用程序做類似的事情。它缺少在模塊和用戶之間創建「依賴關係」。 – masimplo

+0

啊,你說得對。我誤解了你的問題,並認爲這是開發/分期/生產環境的問題。汗米讚的答案是更好的。 –

6

我們的模塊

angular.module("data", []) 
    .constant('apiPrefix', '/api/data'); 

我們可以覆蓋constant完全一樣value

angular.module('myapp', ['data']) 
    .constant('apiPrefix', '/api2/data'); 

我們也可以在config

angular.module('myapp', ['data']) 
    .config(function ($provide) { 
     $provide.constant('apiPrefix', '/api2/data'); 
    }); 

完全覆蓋我們也可以全部或部分(如果對象)在run

angular.module('myapp', ['data']) 
    .run(function (apiPrefix) { 
     apiPrefix = '/api2/data'; 
    }); 

重寫但是,如果我們要覆蓋constant與對象在部分配置(不運行),我們可以做這樣的事情

angular.module("module1", []) 
    .constant('myConfig', { 
     param1: 'value1' , 
     param2: 'value2' 
    }); 

angular.module('myapp', ['data']) 
    .config(function ($provide, myConfig) { 
     $provide.constant(
      'myConfig', 
      angular.extend(myConfig, {param2: 'value2_1'}); 
     ); 
    }); 
+1

用字符串引用myConfig以覆蓋模塊myapp上的擴展值。 angular.module( 'MYAPP',[ '數據']) 的.config(函數($提供,的myconfig){$ provide.constant( 的myconfig, angular.extend( '的myconfig',{參數2:「value2_1 '}); ); }); – Zawarudo

+1

謝謝。是的,'$ provide.constant('myConfig',...''myConfig'必須是一個字符串! –