2013-07-01 12 views
18

अगर आप Angular.js में $ गुंजाइश चर हेरफेर करने के लिए एक नियंत्रक है, वहाँ के लिए एक मुहावरेदार तरीका है:reinitialize एक Angular.js नियंत्रक

  • रीसेट नियंत्रक के $ गुंजाइश है, और
  • पुनः आरंभ नियंत्रक आरंभीकरण ?

जटिल नियंत्रकों के लिए यह यह प्रारंभिक मूल्य है करने के लिए, खासकर यदि आप वास्तव में क्या चाहते हैं नियंत्रक और गुंजाइश का एक सरल होने की आवश्कता है हर चर रीसेट करने के लिए नहीं बहुत सुविधाजनक होगा। $location.path() के माध्यम से फिर से उसी यूआरएल पर नेविगेट करने से मदद नहीं मिलती है।

संपादित करें: मान लीजिए कि मैं किसी भी $window.location हैक का उपयोग नहीं कर सकता क्योंकि यह क्रोम पैक किए गए ऐप्स में सीएसपी का उल्लंघन करेगा।

उत्तर

22

बस पूछने के बाद, मुझे अंततः $route.reload() का उपयोग करके इसे हल करने का एक तरीका मिला।

myapp.Controller('SampleController', function($location, $route) { 

    $scope.navTo = function(url) { 
    if ($location.path() === url) { 
     $route.reload(); 
    } else { 
     $location.path(url); 
    } 
    } 

}); 

मैं अभी भी सोच रहा हूँ, कि कुछ अधिक सुरुचिपूर्ण समाधान होना चाहिए, लेकिन यह निश्चित रूप से मेरे लिए काम करता है।

+1

मैं सहमत नहीं हूँ, मुझे लगता है कि यह एक पूरी तरह से सुरुचिपूर्ण समाधान है। एक अर्थ में, आप पृष्ठ को फिर से लोड कर रहे हैं, इसलिए $ route.reload() बहुत समझ में आता है। – wvdz

+6

@popovitsj: हालांकि यह जानना बहुत अच्छा है कि इसे खराब अभ्यास नहीं माना जाना चाहिए, मैं अभी भी वास्तव में विश्वास नहीं कर रहा हूं। जबकि आप निश्चित रूप से सही हैं कि इस समाधान के लिए कुछ अपील है क्योंकि अर्थात् '$ path.reload() 'पृष्ठ को पुनः लोड करने के समान है, यह अभी भी बहुत अधिक उपर का उत्पादन करता है। यह बहुत से विशिष्ट उपयोग मामलों में अनजान हो सकता है (यह निश्चित रूप से उस समय मेरा था), लेकिन यह अभी भी एक समान साफ ​​विधि होना अच्छा लगेगा जो इस ओवरहेड को बनाने से बचाता है। – bfncs

+0

क्या हम ऑनिनिट की सामग्री को एक निजी विधि में ले जा सकते हैं (इसे 'init' कहें) और इसे ऑनिनिट से कॉल करें और अंत में नियंत्रक को जितनी बार चाहें रीसेट करने के लिए उसी निजी विधि का उपयोग करें? – JVM

2

आप कोणीय-ui-राउटर का उपयोग कर रहे हैं तो आप इस तरह से यह करना चाहिए:

myapp.Controller('SampleController', function($state) { 

    $scope.navigate = function (stateName) { 
     if ($state.is(stateName)) { 
      $state.reload(); 
     } else { 
      $state.go(stateName); 
     } 
    } 
});