9

मैं सैमी के साथ सभी रूट परिवर्तनों को अवरुद्ध करना चाहता हूं ताकि पहले लंबित कार्रवाई हो या नहीं। मैंने sammy.before एपीआई का उपयोग करके ऐसा किया है और मैं रूट रद्द करने के लिए झूठी वापसी करता हूं। यह उपयोगकर्ता को 'पेज' पर रखता है लेकिन यह अभी भी ब्राउज़र पता बार में हैश बदलता है और ब्राउज़र के इतिहास में मार्ग जोड़ता है। अगर मैं मार्ग रद्द करता हूं, तो मैं इसे एड्रेस बार और न ही इतिहास में नहीं चाहता हूं, बल्कि इसके बजाय मैं उम्मीद करता हूं कि पता वही रहे।इतिहास को प्रभावित किए बिना Sammy.js का उपयोग करके मार्ग रद्द करें

वर्तमान में, इस के आसपास पाने के लिए मैं या तो window.history.back (yuk) को इतिहास या sammy.redirect में मूल स्थान पर वापस जाने के लिए कॉल कर सकता हूं। जो दोनों आदर्श से कम हैं।

क्या सैमी वास्तव में मार्ग को रद्द करने का कोई तरीका है, इसलिए यह वर्तमान मार्ग/पृष्ठ पर रहता है, पता बार छोड़ देता है, और इतिहास में नहीं जोड़ता है?

यदि नहीं, तो क्या कोई और रूटिंग लाइब्रेरी है जो यह करेगी?

sammy.before(/.*/, function() { 
    // Can cancel the route if this returns false 
    var response = routeMediator.canLeave(); 

if (!isRedirecting && !response.val) { 
    isRedirecting = true; 
    // Keep hash url the same in address bar 
    window.history.back(); 
    //this.redirect('#/SpecificPreviousPage'); 
} 
else { 
    isRedirecting = false; 
} 
return response.val; 
}); 

उत्तर

17

यदि कोई और इसे हिट करता है, तो यहां मैं समाप्त हुआ हूं। मैंने रूट रीसेट करने के लिए सैमी की context.setLocation सुविधा का उपयोग करने का निर्णय लिया।

sammy.before(/.*/, function() { 
    // Can cancel the route if this returns false 
    var 
     context = this, 
     response = routeMediator.canLeave(); 

    if (!isRedirecting && !response.val) { 
     isRedirecting = true; 
     toastr.warning(response.message); // toastr displays the message 
     // Keep hash url the same in address bar 
     context.app.setLocation(currentHash); 
    } 
    else { 
     isRedirecting = false; 
     currentHash = context.app.getLocation(); 
    } 
    return response.val; 
}); 
+0

Hahaha जॉन, मैं यहाँ बारे में अधिक जानकारी खोज कैसे आप यह लक्ष्य प्राप्त द्वारा मिला आपकी एसपीए श्रृंखला में :-) –

1

प्रश्न के भीतर प्रदान कोड का उपयोग कर और उत्तर की सूचना के लिए उस मार्ग आप रद्द भी भविष्य की सभी कॉल के लिए अवरुद्ध हो जाएगा है, routeMediator.canLeave फिर से मूल्यांकन नहीं किया जाएगा। वर्तमान स्थिति के आधार पर दो बार मार्ग पर कॉल करना और इसे रद्द करना संभव नहीं है।

+1

हम्म। मैं उत्सुक हूं कि आप ऐसा क्यों कहते हैं। मैंने इस कोड का उपयोग किया है और यह भविष्य में कॉल को अवरुद्ध नहीं कर सकता है। क्या आप विस्तार से समझा सकते हैं? अगर मेरे पास एक बग है तो मैं समझना चाहूंगा कि इसे कैसे ठीक किया जाए। –

+0

सैमी दस्तावेज पहले कहता है: "यदि कोई भी कॉलबैक स्पष्ट रूप से झूठी वापसी करता है, तो किसी और कॉलबैक का निष्पादन और मार्ग खुद ही रुक जाता है।" - मैंने उपरोक्त कोड के साथ यही देखा है। यह तब होता है जब अवरुद्ध मार्ग को लगातार दो बार एक्सेस किया जाता है। सबकुछ के बीच एक अन्य मार्ग तक पहुंचने पर ठीक काम करता है। –

+2

मार्ग रोक दिया गया है, हाँ। लेकिन यह नहीं कहता कि मार्ग पर भविष्य की कॉल रोक दी गई है। मुझे यह व्यवहार नहीं दिख रहा है, मैं इसे छोड़ने से रोक सकता हूं, और फिर भी अगली बार इसे कॉल करता है। –

0

मैं उसी परिणाम का उत्पादन कर सकता था जैसे जॉन पापा ने एसपीए/नॉकआउट कोर्स पर सैमीजेएस का इस्तेमाल किया था।

मैंने क्रॉस रोड्स जेएस को राउटर के रूप में उपयोग किया, जो ब्राउज़र द्वारा "उत्सर्जित" यूआरएल परिवर्तनों को सुनने के लिए हैशर जेएस पर निर्भर करता है।

कोड का नमूना है:

hasher.changed.add(function(hash, oldHash) { 
    if (pageViewModel.isDirty()){ 
     console.log('trying to leave from ' + oldHash + ' to ' + hash); 

     hasher.changed.active = false; 
     hasher.setHash(oldHash); 
     hasher.changed.active = true; 

     alert('cannot leave. dirty.'); 
    } 
    else { 
     crossroads.parse(hash); 
     console.log('hash changed from ' + oldHash + ' to ' + hash); 
     } 
}); 
0

एक पुराने परियोजना की समीक्षा और इसी तरह की स्थिति होने के बाद, मैं सिर्फ मामले किसी और यहां पर निर्देशित है, एक और दृष्टिकोण साझा करना चाहते थे।

अनिवार्य रूप से पृष्ठों को रोकने और प्रमाण-पत्रों के आधार पर रीडायरेक्ट करने के लिए एक आधुनिक "ऑथ गार्ड" पैटर्न आवश्यक था।

क्या अच्छी तरह से काम के रूप में यहां बताए गए Sammy.around(callback) का उपयोग कर रहा था: Sammy.js docs: Sammy.Application around(callback)

फिर, बस निम्न ...

(function ($) { 
    var app = Sammy("body"); 

    app.around(checkLoggedIn); 

    function canAccess(hash) { 
     /* access logic goes here */ 
     return true; 
    } 

    // Authentication Guard 
    function authGuard(callback) { 
     var context = this; 
     var currentHash = app.getLocation(); 
     if (!canAccess(currentHash)) { 
      // redirect 
      context.redirect("#/login"); 
     } 
     else { 
      // execute the route path 
      callback(); 
     } 
    }; 

})(jQuery);