2013-02-26 133 views
44

मेरे routeProvider:

$routeProvider 
    .when(
     "/film/list", 
     { 
      templateUrl: '/film/list.html', 
      controller: FilmListController, 
      reloadOnSearch: false 
      } 
      .... 

) 

मैं ऐसा किया क्योंकि मैं डॉन क्वेरी स्ट्रिंग में बदलाव के बाद पूरे नियंत्रक को पुनः लोड करना नहीं चाहते हैं, लेकिन मैं अभी भी इसका उपयोग करता हूं और यूआरएल इस तरह दिखता है: film/list?sort=isbn&order=asc&offset=0। अब जब भी क्वेरी स्ट्रिंग बदलती है मैं अपने नियंत्रक से एक फ़ंक्शन कॉल करना चाहता हूं।

$scope.location = $location; 
$scope.$watch('location.search()', function(search) { 
     $scope.list(); 
}); 

लेकिन यह काम नहीं करता: तो मैं एक $ नियंत्रक में घड़ी की स्थापना की कोशिश की। यदि मैं क्वेरी स्ट्रिंग के व्यक्तिगत पैरामीटर के परिवर्तन देखने के लिए $ सेट करता हूं, तो यह काम करता है। लेकिन मैं अपनी क्वेरी स्ट्रिंग के प्रत्येक पैरामीटर के लिए $ घड़ी सेट नहीं करना चाहता हूं। समाधान मैं अब का उपयोग यह है: खोज के लिए देख रहा है के बजाय

$scope.location = $location; 
$scope.$watch('location.url()', function(url) { 
    if($location.path() == '/film/list') 
     $scope.list(); 
}); 

, मैं पूरी url देखें, और फिर मैं जाँच करता है, तो पथ एक मैं routeProviderमें सेट सशर्त समारोह कॉल करने के लिए है । मुझे इस समाधान के बारे में क्या पसंद नहीं है यह है कि मुझे मिलान करने के लिए $ location.path के लिए मूल्य टाइप करना होगा।

किसी को भी एक बेहतर समाधान सुझाव दे सकते हैं, और शायद मुझे इसका कारण बताएं $ देखने होंगे $ location.search() के लिए काम नहीं कर रहा? के बाद से यह और अधिक कुशल है कि उसके बदले $routeUpdate घटनाओं को सुनने चाहिए,

$scope.$on('$routeUpdate', function(){ 
    $scope.sort = $location.search().sort; 
    $scope.order = $location.search().order; 
    $scope.offset = $location.search().offset; 
}); 
+2

फ़ंक्शन में location.search() को लपेटने का प्रयास करें। Http: // stackoverflow देखें।कॉम/प्रश्न/134656 9 0/अधिक जानकारी के लिए बदलते-द-क्लास-इन-एंजुलरजेस-यूजल-डेटा/13468121 # 13468121। –

+0

एक गहरी घड़ी करो। घड़ी के रूप में 3. तर्क के रूप में सच जोड़ें। –

+0

[एंगुलरजेएस सर्च चेंज इवेंट] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/14867772/angularjs-search-change-event) –

उत्तर

76

आप अपने नियंत्रक में $routeUpdate घटना के लिए सुन सकते हैं।

लेकिन जवाब देने के लिए कि आपकी घड़ी क्यों काम नहीं कर रही है; जब आप location.search() देखते हैं, तो आप देख रहे हैं कि खोज विधि लौटने वाला संदर्भ समान है या नहीं। और यह हर बार जब आप इसे कॉल करते हैं, उसी वस्तु के संदर्भ को वापस कर देगा, यही कारण है कि आपकी घड़ी फायरिंग नहीं कर रही है। यही है, भले ही खोज पैरामीटर बदलते हैं, फिर भी यह वही ऑब्जेक्ट है जो लौटाया जाता है। इसके आस-पास पहुंचने के लिए, आप $watch पर तीसरे तर्क के रूप में सच में पारित हो सकते हैं। यह कोणीय को मूल्य से तुलना करने के लिए बताएगा, संदर्भ नहीं। लेकिन ऐसी घड़ियों को बनाते समय सावधान रहें, क्योंकि वे अधिक स्मृति का उपभोग करेंगे, और निष्पादित करने में अधिक समय लगेगा। तो यही कारण है कि आपको ऐसा करना चाहिए जैसे स्टीवी ने कहा।

+26

बस यह इंगित करना चाहता था कि आपको $ के लिए रूट पर पुनः लोड करने के लिए reloadOnSearch सेट करना है मार्ग उपलब्ध होने के लिए अद्यतन करें। मुझे यह जवाब Google के माध्यम से मिला, और मुझे यह पता लगाने में काफी समय लगा कि क्यों $ रूटअपडेट पहले उपलब्ध नहीं था। (यह दस्तावेज़ों में है, मैं बस इसे याद किया)। – Josh

25

Stewies जवाब सही है:

+0

बढ़िया, यह वास्तव में अच्छी व्याख्या है! मैं स्टीवी के जवाब को स्वीकार करूंगा, अगर आपको पहले जवाब पोस्ट करने के बाद कोई फर्क नहीं पड़ता है, हालांकि यह स्पष्टीकरण जवाब को पूरा करता है। – MBozic

+0

$ 3 (तर्क वस्तु) के लिए तीसरे तर्क का उपयोग करने का सुझाव एक महान युक्ति है। Http://stackoverflow.com/questions/14867772/angularjs-search-change-event/14868586#14868586 साथ ही –

101

मामले में आप कोणीय के मार्ग संकल्प का उपयोग नहीं करते हैं या आप सिर्फ इतना पता है कि जब भी $ स्थान परिवर्तन चाहते हैं, तो एक घटना सिर्फ इतना है कि उद्देश्य

$rootScope.$on('$locationChangeSuccess', function(event){ 
     var url = $location.url(), 
      params = $location.search(); 
}) 
+0

देखें यह सही उत्तर है। यह मेरी समस्या का समाधान किया। क्या ऐसी वैश्विक चर की कोई सूची है जैसे $ locationChangeSuccess? –

+1

@ राकेशबर्बर आप स्रोत कोड में देख सकते हैं :) यह मदद कर सकता है :) –

+0

मुझे आपकी बात मिली। धन्यवाद। :) –

1

घड़ी नियंत्रक में routeUpdate इस तरह पर बदलाव के लिए है:

$scope.$watch('$routeUpdate', function(){ 
    $scope.sort = $location.search().sort; 
    $scope.order = $location.search().order; 
}); 
10

उपयोग

$scope.$watch(function(){ return $location.search() }, function(params){ 
    console.log(params); 
}); 

बजाय।