2012-09-30 11 views
12

मैं इनपुट फ़ील्ड से सर्वर मान को पकड़ने के लिए $ दस्तावेज़ का उपयोग करना चाहता हूं।मॉड्यूल.कॉन्फिग में कौन से प्रदाता/सेवाएं उपलब्ध हैं?

var base_url = $document[0].getElementById('BaseUrl').value; 

आधार यूआरएल टेम्पलेट को पकड़ने के लिए उपयोग किया जाता है।

var base_url = $document[0].getElementById('BaseUrl').value; 

$routeProvider.when('/alert', { 
    controller: function() { }, 
    templateUrl: base_url + '/partials/instances.html' 
}); 

चूंकि $ दस्तावेज़ एक त्रुटि फेंकता है कि यह अज्ञात है कि मुझे लगता है कि यह कॉन्फ़िगरेशन पर उपलब्ध नहीं है? क्या उपलब्ध है और क्या नहीं पता करने का कोई तरीका है? मैं सर्वर से डेटा प्राप्त करने के लिए $ http का भी उपयोग कर सकता हूं लेकिन यह भी उपलब्ध नहीं है।

+0

इस उत्तर को देखें: http://stackoverflow.com/questions/17011616/using-a-relative-path-for-a-service-call-in-angularjs/17112017#17112017 मुझे लगता है कि यह एक बेहतर समाधान है। –

उत्तर

16

AngularJS मॉड्यूल 2 चरणों में चलाया जाता है:

  • Configuration phase जहां केवल प्रदाताओं और स्थिरांक उपलब्ध हैं।
  • Run phase जहां पंजीकृत प्रदाताओं के आधार पर सेवाएं तत्काल हैं। इस चरण में स्थिरांक अभी भी उपलब्ध हैं लेकिन प्रदाताओं नहीं हैं।

AngularJS documentation (अनुभाग: "मॉड्यूल लोड हो रहा है & निर्भरता"):

एक मॉड्यूल विन्यास का एक संग्रह है और ब्लॉक के दौरान जो आवेदन करने के लिए आवेदन प्राप्त चलाने इस अंतर्दृष्टि प्रदान करता है बूटस्ट्रैप प्रक्रिया। इसके में सरलतम रूप मॉड्यूल ब्लॉक के दो प्रकार के संग्रह से मिलकर बनता है:

विन्यास ब्लॉक - प्रदाता पंजीकरण और विन्यास चरण के दौरान निष्पादित हो। कॉन्फ़िगरेशन ब्लॉक में केवल प्रदाताओं और स्थिरांक को इंजेक्शन दिया जा सकता है। यह पूरी तरह कॉन्फ़िगर किए जाने से पहले सेवाओं के आकस्मिक तत्काल को रोकने के लिए है।

भागो ब्लॉक - के बाद इंजेक्टर बनाई गई है निष्पादित हो और आवेदन किकस्टार्ट किया जाता है। केवल उदाहरण और स्थिरांक को ब्लॉक में इंजेक्शन दिया जा सकता है। यह एप्लिकेशन रन टाइम के दौरान और सिस्टम कॉन्फ़िगरेशन को रोकने के लिए है।

उपर्युक्त को देखते हुए आप केवल स्थिरांक और प्रदाताओं को इंजेक्ट कर सकते हैं (एपीआई दस्तावेज़ों में Provider प्रत्यय के साथ चिह्नित)। यह शायद आपके प्रश्न का उत्तर देता है लेकिन टेम्पलेट लोड करने की आपकी समस्या को हल करने में मदद नहीं करता है ...

मुझे आश्चर्य है कि क्या आप HTML में बेस टैग का उपयोग नहीं कर सकते हैं और फिर बिना सापेक्ष पथ (आधार पर) का उपयोग कर सकते हैं पूर्ण पथ निर्दिष्ट करना?Sth की तरह (बशर्ते कि आधार सही तरीके से कॉन्फ़िगर):

कैसे एक कोणीय निरंतर उपयोग करने के लिए:

$routeProvider.when('/alert', { 
    controller: function() { }, 
    templateUrl: 'partials/instances.html' 
}); 
+0

मुझे लगता है कि मैं सापेक्ष पथ समाधान के साथ जाऊंगा। ऐसा कारण था जिसका मैं उपयोग नहीं करना चाहता था लेकिन शायद यह सबसे अच्छा समाधान है। – Pickels

16

हालांकि सवाल आम तौर पर उत्तर दिया गया है, यहाँ एक छोटे से अतिरिक्त ठोस प्रश्न में प्रयोग किया जाता उदाहरण को लक्षित है अपने partials की baseurl परिभाषित करने के लिए (या अन्य स्थिरांक विन्यास के लिए उपलब्ध सर्वर मूल्यों का प्रतिनिधित्व करने और उन्हें परिभाषित करने के लिए):

// file: app.js 
'use strict'; 

/* App Module */ 
angular.module('myApp', []) 

    // define the templateBaseUrl 
    .constant('templateBaseUrl', 'themes/angular/partials/'); 

    // use it in configuration 
    .config(['$routeProvider','templateBaseUrl', function($routeProvider,templateBaseUrl) { 
    $routeProvider 
     .when('/posts', { 
     templateUrl : templateBaseUrl + 'post-list.html', 
     controller : PostListCtrl 
     }) 
     .when('/posts/:postId-:slug', { 
     templateUrl : templateBaseUrl + 'post-view.html', 
     controller : PostViewCtrl 
     }) 
     .when('/about', { 
     templateUrl : templateBaseUrl + 'about.html', 
     controller : AboutPageCtrl 
     }) 
     .when('/contact', { 
     templateUrl : templateBaseUrl + 'contact.html', 
     controller : ContactPageCtrl 
     }) 
     .otherwise({ 
     redirectTo: '/posts' 
     }) 
    ; 
    }]); 

मेरी राय में, इस कई लाभ हैं:

  • आप अपने दृश्यों ले जाते हैं, आप केवल
  • एक ही स्थान पर अपने कोड को अद्यतन करने के लिए अपने partials गहरा अपनी परियोजना लेआउट के भीतर नेस्ट रहे हैं की जरूरत है, "templateBaseUrl" पूरे पथ के रूप में के रूप में ज्यादा शोर का कारण नहीं है
  • तुम भी सापेक्ष और निरपेक्ष पथ
  • An answer to a similar question के बीच बदल सकता हैं एचटीएमएल के आधार तत्व के प्रयोग प्रत्येक templateUrl करने के लिए एक baseurl prepending की आवश्यकता को दूर करने के लिए पता चलता है। लेकिन इसने वेबसाइट पर अन्य सभी संसाधनों को भी प्रभावित किया। टेम्पलेट्स के लिए केवल बेस यूआरएल को कॉन्फ़िगर करने के लिए कोई दुष्प्रभाव नहीं है

आम तौर पर, मैं इस समाधान का उपयोग ऊपर की तरह हार्ड कोड वाले मूल्य के साथ नहीं करता। यह दिखाने के लिए केवल एक उदाहरण है कि सबसे सरल तरीके से क्या करना है।

// file: index.php 
<?php 
    // only depends on your project layout 
    $angularPartialsBaseUrl = 'themes/angular/partials/'; 
    // this will change when you move the app around on the server 
    $themeBaseUrl = $_SERVER['REQUEST_URI'] . 'themes/angular'; 
?><!DOCTYPE html> 
<html ng-app="myApp"> 
<head> 
    <title>Yii Blog Demo</title> 

    <script> 
     var myNS = myNS || {}; 
     myNS.appConfig = myNS.appConfig || {}; 
     myNS.appConfig.templateBaseUrl = '<?php echo $angularPartialsBaseUrl; ?>'; 
    </script> 

    <script src="<?php echo $themeBaseUrl; ?>/js/vendor/angular/angular.js"></script> 
    <script src="<?php echo $themeBaseUrl; ?>/js/app.js"></script> 

</head> 

[...] 

और app.js में:

// file: app.js 
'use strict'; 

/* App Module */ 
angular.module('myApp', []) 

    // define the templateBaseUrl using external appConfig 
    .constant('templateBaseUrl', myNS.appConfig.templateBaseUrl); 
अपने अनुप्रयोग के आसपास अपने सर्वर पर, मूल्य app.js के बाहर अपने इंडेक्स फ़ाइल में कॉपी परिभाषित करते हैं, और उत्पन्न करने के लिए आवश्यक pathes सर्वर साइड सक्षम होने के लिए
संबंधित मुद्दे