2015-09-10 10 views
12

के साथ राज्य बदलते समय पहले प्रदान किए गए वैकल्पिक पैराम को कैसे हटाएं मेरे पास एक वैकल्पिक क्वेरी पैरामीटर वाला एक राज्य है। मैंने सोचा कि यह ठीक काम कर रहा था, लेकिन मुझे पता चला कि एक बार जब मैं वैकल्पिक पैरामीटर निर्दिष्ट करता हूं, तो उस बिंदु से इसे बरकरार रखा जाता है, क्योंकि मैं अन्य पैरामीटर के साथ उसी स्थिति में नेविगेट करता हूं, जब तक कि वैकल्पिक पैरामीटर स्पष्ट रूप से हटा नहीं जाता है।यूई-राउटर

क्या यह सुनिश्चित करने का कोई तरीका है कि वैकल्पिक परिवर्तन पैरामीटर राज्य परिवर्तनों के बीच हटा दिया गया है?

यह एक उदाहरण है कि मैं राज्य कैसे बदलना चाहता हूं (परीक्षण ए और टेस्ट बी), लेकिन यह पता चला है कि वैकल्पिक पैरामीटर के प्रतिधारण के कारण मुझे 'टेस्ट डी' संस्करण का उपयोग करना होगा यदि इसका उपयोग किया गया है पहले से।

<a ui-sref="test({req: 'a'})">test a</a><br/> 
<a ui-sref="test({req: 'b'})">test b</a><br/> 
<a ui-sref="test({req: 'c', opt: 'here'})">test c and opt</a><br/> 
<a ui-sref="test({req: 'd', opt: undefined})">test d and explicity without opt</a> 

यह कैसे मेरे राज्य कॉन्फ़िगर किया गया है के समान है:

 $stateProvider.state('test', { 
      url: '/{req}?opt', 
      params: { 
       opt: {value: null, squash: true} 
      }, 
      template: '<h1>req = {{req}}</h1>' + 
        '<h1>opt = {{opt}}</h1>', 
      controller: function($scope, $stateParams) { 
       $scope.req = $stateParams.req; 
       $scope.opt = $stateParams.opt; 
      } 
     }) 

यहाँ एक jsfiddle है। पहले दो लिंक पर क्लिक करें, और यह अपेक्षित के रूप में काम करता है, लेकिन एक बार जब आप तीसरे लिंक पर क्लिक करते हैं, और उसके बाद पहले दो लिंक में से किसी एक पर क्लिक करें, तो आप देखेंगे कि वैकल्पिक पैरामीटर बरकरार रखा गया है, भले ही इसे छोड़ा गया हो पहले दो लिंक।

मैं वैकल्पिक पैरामीटर को स्पष्ट रूप से रीसेट करना नहीं चाहता, और यदि यह वैकल्पिक है तो यह वास्तव में काम करता है।

कोई विचार? क्या यह काम करने के लिए डिज़ाइन किया गया है? यदि हां, तो क्या मैं इसे जिस तरह से काम करना चाहता हूं, उसे पाने का कोई तरीका है? या मैंने एक बग खोजा है?

अद्यतन

ऐसा लगता है कि वैकल्पिक परम को बनाए रखना नीचे जवाब में से एक के आधार पर 'के रूप में तैयार किया गया' है। हालांकि, यदि भी संभव हो, मैं अभी भी एक कुशल कामकाज देख रहा हूं। मैं अपने ऐप में कई स्थानों से राज्य में संक्रमण करता हूं, और उनमें से 99% वैकल्पिक पैरामीटर निर्दिष्ट नहीं करते हैं। मैं उन सभी संक्रमणों को संशोधित नहीं करना चाहूंगा और वैकल्पिक पैरामीटर के बारे में उन्हें बताना नहीं चाहूंगा, और इसके बजाय, वैकल्पिक पैरामीटर को केवल उस समय के 1% निर्दिष्ट करें जब मुझे इसकी आवश्यकता हो।

मैंने दो राज्य "परीक्षण" और एक बच्चा "test.opt" बनाने के लिए प्रयास किया है और फिर सामान्य रूप से "परीक्षण" में संक्रमण (यानी, 'परीक्षण ए' और 'टेस्ट बी'), और केवल " test.opt "जब मैं वैकल्पिक पैरामीटर निर्दिष्ट करता हूं। हालांकि, मेरे पास एक संकल्प है जो एक बाकी कॉल करता है और इसे पता होना चाहिए कि क्या ऑप्ट पैरामीटर सेट किया गया है, इसलिए यह काम नहीं करता है क्योंकि संकल्प बच्चे से 'ऑप्ट' तक नहीं पहुंच सकता है।

अद्यतन # 2

मैं भी 'परीक्षण' राज्य का डुप्लिकेट बनाने की कोशिश की है, 'testopt' जिस स्थिति में फर्क सिर्फ इतना है? पैरामीटर चुनते है नाम दिया है। हालांकि, स्पष्ट रूप से यूई-राउटर दो यूआरएल के बीच अंतर नहीं कर सकता है जो केवल क्वेरी पैरा द्वारा भिन्न होता है, और इसलिए यह अभी भी 'परीक्षण' में संक्रमण करने की कोशिश करता है भले ही ऑप्टिम यूआरएल यूआरएल का हिस्सा हो।

<a ui-sref="test({req: 'a'})" ui-sref-opts="{inherit: false}">test a</a><br/> 
<a ui-sref="test({req: 'b'})" ui-sref-opts="{inherit: false}">test b</a><br/> 
<a ui-sref="test({req: 'c', opt: 'here'})" ui-sref-opts="{inherit: false}">test c and opt</a><br/> 
<a ui-sref="test({req: 'd', opt: undefined})" ui-sref-opts="{inherit: false}">test d and explicity without opt</a> 

धागा है कि इस सुविधा का अनुरोध और कार्यान्वयन दस्तावेजों:

+0

लगता है आप की तरह इस बारे में पूछ रहे http://stackoverflow.com/questions/31542972/how-to-persist-optional-parameter-on-browser-back -इन-यूई-राउटर और उसी https://github.com/angular-ui/ui-router/issues/2115 –

+0

के खिलाफ लॉग इन किया गया है, मुझे नहीं लगता कि यह एक ही समस्या है। यह सवाल वैकल्पिक पैरामीटर को बनाए रखने के बारे में था, इसलिए उम्मीद के अनुसार 'बैक' काम करता है। मेरी समस्या यह है कि नए राज्य में नेविगेट करते समय भी बरकरार रखा जा रहा है। बग के लिए चर्चा समाधान राज्य पैरा को कैश करना है ताकि वे 'बैक' पर जाकर पहुंच सकें। साथ ही, जैसा कि आप देख सकते हैं, मैं वास्तव में यूआरएल पर परम का उपयोग कर रहा हूं, जो थोड़ा अलग है। एसओ सवाल का समाधान कहता है कि मुझे मैन्युअल रूप से पैरामीटर को हटाना है, जो मैं एक विकल्प खोजने की कोशिश कर रहा हूं। – DavidA

उत्तर

19

आप अपने लिंक को इनहेरिट = false की ui-sref-opts विकल्प जोड़ने https://github.com/angular-ui/ui-router/issues/376

---- संपादित करें --- -

चूंकि उपर्युक्त समाधान आदर्श प्रतीत नहीं होता है क्योंकि इसे वांछित व्यवहार निर्धारित करने के लिए प्रत्येक यूई-एसईआर एंकरों को अद्यतन (और बनाए रखने) की आवश्यकता होती है, तो दूसरा समाधान राज्य की go(...) विधि को सेट करने के लिए ओवरराइड करना पड़ सकता है ई inherit डिफ़ॉल्ट रूप से गलत करने के लिए विकल्प। मापदंडों के डिफ़ॉल्ट विरासत की वजह से,

.config(['$stateProvider', '$provide', function ($stateProvider, $provide) { 
    $stateProvider.state('test', { 
     url: '/{req}?opt', 
     params: { 
      opt: {value: null, squash: true} 
     }, 
     template: '<h1>req = {{req}}</h1>' + 
      '<h1>opt = {{opt}}</h1>', 
     controller: function($scope, $stateParams) { 
      $scope.req = $stateParams.req; 
      $scope.opt = $stateParams.opt; 
     } 
    }); 

    $provide.decorator('$state', function ($delegate) { 
     var state = $delegate; 

     state.baseGo = state.go; 

     var go = function (to, params, options) { 
      options = options || {}; 

      if (angular.isUndefined(options.inherit)) { 
       options.inherit = false; 
      } 

      this.baseGo(to, params, options); 
     }; 

     state.go = go; 
     return $delegate; 
    }); 
}]) 
+0

यह एक विकल्प है, लेकिन 'test d' की तरह अपरिभाषित विकल्प को सेट करने से बहुत अलग प्रतीत नहीं होता है। स्थिति यह है कि मेरे 99% लिंक पहले प्रकार के हैं, और केवल एक ही स्थान मैं वैकल्पिक मान का उपयोग करता हूं। यदि संभव हो तो मैं सभी 99% अन्य स्थानों को 'वैकल्पिक' पैरामीटर के लिए खाता नहीं रखना चाहता हूं। – DavidA

+0

कृपया मेरा अद्यतन उत्तर देखें। – GPicazo

+0

जो मैं चाहता हूं उसके करीब है, * लगभग * बिल्कुल। हालांकि, दो समस्याएं हैं। पहला यह है कि ऐसा प्रतीत होता है कि options.inherit डिफ़ॉल्ट रूप से सेट है, इसलिए यदि आपका अपरिभाषित है तो आपकी जांच हमेशा विफल हो जाती है। हालांकि, यहां तक ​​कि अगर मैं इसे झूठी करने के लिए मजबूर करता हूं। Ui-sref के माध्यम से बनाए गए लिंक अभी भी विरासत पैरामीटर शामिल हैं। नेविगेशन मूल रूप से काम करता है, लेकिन यदि कोई उपयोगकर्ता राइट क्लिक और 'लिंक सहेजें' पर था, तो param वहां होगा। मदद और सुझावों के लिए धन्यवाद। – DavidA

5

मैं एक ही समस्या थी ... पूरा करने के लिए: एक ओर जहां मुझे यकीन है कि अगर यह एक सिफारिश पैटर्न है नहीं कर रहा हूँ, यह है, तो निम्न करने के लिए अपने .config बदल करने के लिए पिछले जवाब, जे एस कॉल के लिए syntaxe है:

$state.go('new state', {pararemeters... } , {inherit:false});