2014-04-09 15 views
9

modül değerlerini/sabitlerini geçersiz kılmanın en iyi yolu Tüm arka uç iletişimini kapsülleyen bir modülde angularJS yazdım. Daha fazla esneklik için, modülde sabit bir değer olarak api önekine sahibim (yapılandırma aşamasında kullanmadığım için değer olabilir). böyleceAngularJS

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

gibi bir şey Şimdi iki farklı uygulamalardan bu modülü kullanmak istiyorum. Biri/api1/data ve diğeri/api2/data kullanır ve uygulamanın konfigürasyon aşamasında bunu değiştirmek isterim. Bunu bir sağlayıcıyla nasıl yapacağımı biliyorum, ancak bir değeri elinde tutmak için bir sağlayıcım olması bana göre bir overkill gibi görünüyor. Kullanılan yapılandırma modülleri sabitlerini veya değerleri uygulama yapılandırma aşamasından değiştirebilir miyim? gibi

şey: Onlar üst seviyede olmak zorunda yoksa-tablolar vs.

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

Emin değilim, ancak bunu "run" aşamasında yapmayı deneyebilirsiniz. – Chandermani

+0

Evet, çalışma aşamasındaki bir değeri güncelleyebilir ve yapılandırmada bir sabit enjekte edebilirsiniz ancak sabit olduğundan, değiştirilemez http://stackoverflow.com/questions/13035568/angular-js-value-not -injected-in-config – shaunhusain

+0

Yani söyledikleriniz modülde bir sabit yerine bir değer olmalı ve config yerine uygulamanın çalışma aşamasında değiştirilmelidir? – masimplo

cevap

10

, sonraki modüllerde açısal değeri yeniden tanımlayabilirsiniz. Modül yapılandırma zamanı yapılmaması gerektiğine inanıyorum.

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(); 
    }); 

burada plunker bkz: http://plnkr.co/edit/k806WE

aynı şey çok köşeli sabitleri için geçerlidir.

+2

Harika çözüm. Kötü bir şekilde, bir modül sabitini veya değerini yanlışlıkla geçersiz kılabildiğimden beri, onları çok fazla kullanmamdan ötürü bilmiyorum. İyi ki her zaman benzersiz tanımlayıcı isimler oluşturmaya çalışıyorum. – masimplo

+0

Teşekkürler @ mxa055. Aslında, ayrı bir yapılandırma modülünde konfigürasyon veya arka uç api uç noktaları gibi sabitleri ve değerleri tutmayı tercih ederim. – khanmizan

1

Eğik modüller, kontrolörleri, vb fonksiyonlar içinde yer olabilir. Yani, bunu kodunuza ekleyebilirsin:

Yardım edin! Modül değerlerini geçersiz kılmak için

+0

Bu kulağa ilginç geliyor, ancak beni kullanabilecek her farklı uygulama için modülümde böyle bir şey yapmaktan nefret ediyorum.Kısaca, modül ve kullanıcıları arasında bir "bağımlılık" yaratır. – masimplo

+0

Ah, haklısın. Sorunuzu yanlış anladım ve bunun bir geliştirme/hazırlık/üretim ortamı meselesi olduğunu düşündüm. Khanmizan'ın cevabı daha iyi. –

6

Bizim modül

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

Biz value gibi tam constant, geçersiz kılabilir.

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

da daha da tam olarak veya kısmen (bir amacı ise) run

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

içinde geçersiz kılmak için config

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

tamamen geçersiz kılabilir Ancak nesne ile constant geçersiz kılmak için ise Kısmen yapılandırmada (çalışma zamanında değil), böyle bir şey yapabiliriz

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

Referans myspace ile myspace üzerindeki değerleri genişletmek için string ile referans myConfig. angular.module ('myapp' [ 'veri']) .Config (fonksiyonu ($, myConfig sağlar) { $ provide.constant ( myConfig, angular.extend ('myConfig', {param2: 'value2_1 '}); ); }); – Zawarudo

+1

Teşekkürler. Evet, $ offer.constant ('myConfig', ... '- 'myConfig' dizesi olmalı! –