2015-11-08 8 views
20

जैसा कि शीर्षक कहता है, मैं जो करना चाहता हूं वह यूआरएल से सभी चर पकड़ लेता है और उन्हें स्कोप वैरिएबल में रखता है। ,क्वेरी पैरामीटर से सभी स्कोप चर प्राप्त करें

m.controller('maps', function ($scope) { 
    $scope.opts = { 
     val: false, 
     lav: false 
    }; 
    $scope.eg = "Hello, World!"; 
}); 

मूलतः:

अनिवार्य रूप से, मैं एक

http://example.com?opt.val=true&eg=foobar 

मैं अपने नियंत्रक कोड है इस तरह यूआरएल (प्रारूप बदला जा सकता है), जो तरह दिखता होगा मैं यह करना चाहता हूं कि इस भाग को पकड़ना: opt.val=true&eg=foobar और उन मानों पर नियंत्रक चर सेट करें ताकि मैं अपने चर के साथ समाप्त हो जाऊं:

$scope.opt.val = true; 
$scope.eg  = "foobar"; 
$scope.lav  = false; 

वहाँ के बजाय ऐसा करने evaling/यूआरएल को पार्स, तो बस पाशन और दायरे में यह डंपिंग करने के लिए एक "कोणीय" या बेहतर तरीका है? यह एक बहुत ही "हैकी" तरीके की तरह लगता है।


यदि यह पर्याप्त स्पष्ट नहीं है, मैं और अधिक स्पष्टीकरण

उत्तर

11

ठीक है, शुरुआत के लिए, आप बस $location सेवा

var search = $location.search(); 
// should look like 
// { 
//  "opt.val": "true", 
//  "eg": "foobar" 
// } 

अगला का उपयोग कर मूल्यों प्राप्त कर सकते हैं, तो आप उपयोग कर सकते हैं $parse सेवा को $scope

पर मान निर्दिष्ट करने के लिए सेवा 210
angular.forEach(search, function(val, key) { 
    $parse(key).assign($scope, val); 
}); 

ध्यान रखें कि $location.search() में हर मूल्य, एक स्ट्रिंग है "true" और "false" सहित ताकि आप अगर आप बूलियन मान चाहते हैं उन को संभालने के लिए कुछ अतिरिक्त तर्क पड़ सकता है। इस

angular.forEach(search, function(val, key) { 
    var evald = $scope.$eval(val); 
    if (evald !== undefined) { 
     val = evald; 
    } 
    $parse(key).assign($scope, val); 
}); 

Plunker डेमो ~ http://plnkr.co/edit/xOnDdWUW8PgsMFgmXr0r?p=preview

+0

तुम सच में '$ parse' के साथ लाइन वहाँ, की जरूरत है या के रूप में '$ स्कोप [कुंजी] = वैल; 'पर्याप्त अच्छा होगा? – TMG

+1

@ टीएमजी जो '$ स्कोप ['opt.val'] सेट करेगा,' scope.opt.val' – Phil

+0

ओह, यह एक अच्छा बिंदु है! – TMG

4

कोणीय तरीका होगा प्रदान करने के लिए खुशी होगी। बस अपने नियंत्रक में $ रूट पैराम इंजेक्ट करें।

देखें

// Given: 
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby 
// Route: /Chapter/:chapterId/Section/:sectionId 
// 
// Then 
$routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'} 

नीचे दिए गए उदाहरण यहाँ अधिक विवरण देखें $routeParams

+0

यह इतना * "कोणीय रास्ता" नहीं है आशा है कि * यह * "ngRoute रास्ता" * – Phil

1

url.js की तरह हो सकता है कि कुछ आपके लिए उपयोगी हो सकता है। उदाहरण:

url.parse("http://example.com?opt.val=true&eg=foobar").get.eg === "foobar" 
5

कुछ तरीके आप ऐसा कर सकते हैं:

# 1 आप कोणीय की URLRouting उपयोग कर रहे हैं

का उपयोग $ StateParams, आप $ stateParams जो रिटर्न आप अपनी ज़रुरत के उपयोग कर सकते हैं । आपको बस इतना करना है, अपने राउटर में अपने पैरामीटर को परिभाषित करें।उदाहरण:

$stateProvider 
.state('contacts.detail', { 
    url: "/contacts?myParam&myParam2", 
    templateUrl: 'contacts.detail.html', 
    controller: function ($stateParams) { 
     // If we got here from a url of /contacts/42 
     expect($stateParams).toBe({contactId: "42"}); 
    } 
}) 

यह myParam और myParam2 प्राप्त अपने मार्ग संपर्कों को परिभाषित करता है। इस के बाद, आप अपने नियंत्रक में इस पैरामीटर बहुत आसान पार्स करने के लिए $ stateParamsService उपयोग कर सकते हैं:

controller: function($stateParams){ 
    $stateParams.myParam //*** Exists! ***// 
} 

# 2 आप मार्गों का उपयोग नहीं कर रहे हैं, तो $ स्थान

का उपयोग करना, और अधिक निम्न स्तर चाहते हैं सेवा, आप अपने नियंत्रक और सेवा में $location इंजेक्षन कर सकते हैं, और querys, जैसे पार्स:

var paramValue = $location.search().myParam; 

लेकिन यह पहली html5mode सक्षम करने के लिए आवश्यक है, और यह

०१२३५१६४१०६१ काम करेंगे
$locationProvider.html5Mode(true); 

यह मदद करता है

+0

में लपेटना पड़ सकता है आपको '$ location.search()' का उपयोग करने के लिए HTML5 मोड की आवश्यकता नहीं है। – Phil

संबंधित मुद्दे