2013-11-22 19 views
10

में बेस यूआरएल को पैरामीटरेट करें मैं कई कोणीय जेएस $ संसाधन परिभाषाओं का उपयोग कर रहा हूं जिनमें से सभी कॉन्फ़िगरेशन सेवा से अपना बेस यूआरएल पुनर्प्राप्त करते हैं। उदाहरण के लिए:

$resource(config.baseURL() + '/api/v2/foo/:id', {id: '@id'}) 

$resource(config.baseURL() + '/api/v2/bar/:id', {id: '@id'}) 

कारण यह किया जाता है कि बुनियादी URL एक क्वेरी स्ट्रिंग पैरामीटर के माध्यम से बदला जा सकता है जब आवेदन पहली भरी हुई है है।

मैं पता लगा कि (पीछे मुड़कर देखें तो स्पष्ट रूप से) $ संसाधन द्वारा प्रयोग किया जाता यूआरएल सिर्फ एक बार तो यह एक रेस स्थिति जहां एक विशेष $ संसाधन के लिए URL आधार URL क्वेरी स्ट्रिंग से पहले आरंभ नहीं हो जाता प्राप्त करना संभव है आरंभ नहीं हो जाता पैरामीटर के साथ निपटाया जाता है। तो मैं इस के लिए $ संसाधन घोषणा बदलने की कोशिश की:

$resource(':baseURL/api/v2/foo/:id', {baseURL: config.baseURL(), id: '@id'}) 

दुर्भाग्य आधार URL भाग निकले हो रही है - //%2F%2F में बदल जाती है - तो पूरे यूआरएल तो ठीक से काम नहीं करता है।

क्या उस पैरामीटर के लिए भागने को दबाए रखने का कोई तरीका है? (या सामान्य रूप से समस्या को हल करने का एक बेहतर तरीका)?

+0

क्यों अपने baseurl भी बदल जाता है? –

+1

यह कई वातावरण का समर्थन करने के लिए एक सामरिक समाधान है। यानी अगर मुझे कुछ डीबग करने की ज़रूरत है तो मैं आसानी से एक स्टेजिंग एपीआई पर एक उदाहरण इंगित कर सकता हूं। आदर्श नहीं है और मैं एक दीर्घकालिक समाधान देख रहा हूं। –

+0

आप http: // भाग को पहले पैरामीटर में एम्बेड करने और config.baseURL() से शेष भाग को पास करने का प्रयास कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं। – Chandermani

उत्तर

0

क्यों $ स्थान सेवा का उपयोग नहीं करते?

उदाहरण के लिए, बेस यूआरएल को संभालने के लिए निम्नलिखित के बारे में कैसे, और यदि एप्लिकेशन स्थानीयहोस्ट से चल रहा है, तो पोर्ट नंबर शामिल करें? इसके अतिरिक्त, वर्तमान यूआरएल के आधार पर या तो http या https शामिल करने में सक्षम हो?

var host = $location.host(); 
if (host === "localhost") 
    host += ":" + $location.port(); 
var url = $location.protocol() + "://" + host + "/whateverElseYouWantInThePath"; 

और फिर url का उपयोग करें जहां आपको इसकी आवश्यकता है?

0

संसाधन की परिभाषा से,

  • @param {स्ट्रिंग}
  • /user/:username में के रूप में URL : लगाया जाता मानकों के साथ एक parametrized URL टेम्प्लेट। यदि आप एक पोर्ट संख्या (जैसे
  • http://example.com:8080/api) के साथ एक यूआरएल का उपयोग कर रहे हैं, तो आप
  • संख्या बंदरगाह से पहले पेट के चरित्र से बचने के लिए इस तरह, की आवश्यकता होगी: djResource('http://example.com\\:8080/api')

तो आप अपने config.baseURL() के रूप में परिभाषित करने के लिए,

config.baseUrl = function(){ 
    return 'http://server.com\\:port/rest_part/'; 
} 
0

यहाँ एक भयानक लेकिन काम कर समाधान नहीं है है।

var url = {}; 
url.value = function() {return config.baseURL() + '/api/v2/foo/:id'}; 
url.split = function (separator,limit) { return url.value().split(separator,limit) }; 
url.replace = function (match, other) { return url.value().replace(match, other) }; 
url.toString = function() { return url.value(); } 
$resource(url, {id: '@id'}) 
2

एक और तरीका है कि आप से निपटने कर सकते हैं यह है: इसके बजाय ...

$resource(config.baseURL() + '/api/v2/foo/:id', {id: '@id'}) 

... जो केवल एक बार मूल्यांकन किया जाता है, एक वस्तु को लागू करने वाली स्ट्रिंग-तरीकों कि ngResource प्रत्येक अनुरोध से पहले का मूल्यांकन करता है का उपयोग करें प्रदाता का उपयोग करें और इसे कॉन्फ़िगर चरण में कॉन्फ़िगर करें।

यहां कुछ ऐसा उदाहरण है जैसा मैंने कुछ समय पहले किया था।

.provider('Environment', function() { 
    var environments = { 
     dev: { 
      root: 'http://localhost', 
      port: 3000, 
      api: '/api', 
      version: 'v1' 
     } 
    }; 
    var selectedEnv = 'dev'; 
    var self = this; 

    this.setEnvironments = function (envs) { 
     if (!Object.keys(envs).length) 
      throw new Error('At least one environment is required!'); 

     environments = envs; 
    }; 

    this.setActive = function (env) { 
     if (!environments[env]) 
      throw new Error('No such environment present: ' + env); 

     selectedEnv = env; 
     return self.getActive(); 
    }; 

    this.getEnvironment = function (env) { 
     if (!env) 
      throw new Error('No such environment present: ' + env); 
     return environments[env]; 
    }; 

    this.getActive = function() { 
     if (!selectedEnv) 
      throw new Error('You must configure at least one environment'); 

     return environments[selectedEnv]; 
    }; 

    this.getApiRoute = function() { 
     var active = self.getActive(); 
     return active.root + (active.port ? ':' + active.port : '') + 
      active.api + (active.version ? '/' + active.version : ''); 
    }; 

    this.$get = [function() { 
     return self; 
    }]; 
}) 
फिर config चरण में

:

.config(function (EnvironmentProvider) { 

    EnvironmentProvider.setEnvironments({ 
     dev: { 
      root: 'http://10.0.0.3', 
      api: '/api', 
      version: 'v1' 
     }, 
     localonly: { 
      root: 'http://localhost', 
      api: '/api', 
      version: 'v1' 
     }, 
     prod: { 
      root: 'https://myapp.mybackend.com', 
      api: '/api', 
      version: 'v1' 
     } 
    }); 

    //Set prod as the active schema 
    EnvironmentProvider.setActive('prod'); 
}); 

कुछ नियंत्रक/सेवा/कारखाने में बाद में:

.factory('API',function($resource, Environment){ 
return { 
    User: $resource(Environment.getApiRoute() + '/users/:id', {id: '@_id'}), 
    OtherResource: $resource(Environment.getApiRoute() + '/otherresource/:id', {id: '@_id'}) 
} 
}); 
+1

यह एक अच्छा समाधान है! –