2014-04-09 7 views
9

में स्थिरांक मैं AngularJS में एक मॉड्यूल है कि सभी बैकएंड संचार समाहित लिखा है। अधिक लचीलापन के लिए मेरे पास मॉड्यूल पर स्थिर मान के रूप में एपीआई उपसर्ग है (मान हो सकता है क्योंकि मैं इसे कॉन्फ़िगर चरण में उपयोग नहीं कर रहा हूं)। तो जैसे/AngularJS

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

कुछ अब मैं दो अलग अलग अनुप्रयोगों से इस मॉड्यूल का उपयोग करना चाहते हैं। एक उपयोग/एपीआई 1/डेटा और दूसरा एक/एपीआई 2/डेटा और मैं इसे एप्लिकेशन के कॉन्फ़िगर चरण के दौरान बदलना चाहता हूं। मुझे पता है कि एक प्रदाता के साथ ऐसा कैसे करना है, लेकिन एक प्रदाता रखने के लिए प्रदाता होने के कारण मुझे एक ओवरकिल लगता है। क्या मैं अनुप्रयोग कॉन्फ़िगरेशन चरण से प्रयुक्त मॉड्यूल स्थिरांक या मान संशोधित कर सकता हूं?

कुछ की तरह:

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-इन-config – shaunhusain

+0

तो क्या आप कह रहे हैं कि यह मॉड्यूल में एक निरंतर के बजाय एक मूल्य हो सकता है और config के बजाय आवेदन के रन मंच पर इसे संशोधित करना चाहिए? – 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। दरअसल, मैं एक अलग कॉन्फ़िगरेशन मॉड्यूल में कॉन्फ़िगरेशन या बैकएंड एपीआई एंडपॉइंट्स जैसे स्थिरांक और मान रखना पसंद करता हूं। – khanmizan

1

कोणीय मॉड्यूल, नियंत्रक, आदि, कार्यों के भीतर समाहित किया जा सकता है-बयान, आदि वे शीर्ष स्तर पर होने की जरूरत नहीं है। तो, आप इसे अपने कोड में शामिल कर सकते हैं:

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 ओवरराइड करने के लिए चाहते हैं, तो आंशिक रूप से config (समय में नहीं) में, हम इस

की तरह कुछ कर सकते हैं
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

मॉड्यूल myapp पर मूल्यों को ओवरराइड करने के लिए स्ट्रिंग के साथ myConfig संदर्भ। angular.module ('MyApp', [ 'डेटा']) .config (समारोह ($ प्रदान करते हैं myConfig) { $ provide.constant ( myConfig, angular.extend ('myConfig', {param2: 'value2_1 '}); ); }); – Zawarudo

+1

धन्यवाद। हां, '$ offer.constant ('myConfig', ... '-' myConfig 'एक स्ट्रिंग होना चाहिए! –