2013-02-13 12 views
9

का उपयोग कर चुनिंदा इतिहास.बैक() मेरे पास बैकबोन ऐप है। मैं बैकबोन.history का उपयोग बैक बटन के उपयोग को सक्षम करने के लिए कर रहा हूं। हमारे पास एक पृष्ठ (सेटिंग्स) है जो स्वतः पॉपअप को उपयोगकर्ता से इनपुट की आवश्यकता होती है। यदि उपयोगकर्ता रद्द करना चुनता है, तो मैं पिछले पृष्ठ पर वापस जाना चाहता हूं। मैं window.history.back() का उपयोग करके ऐसा कर सकता हूं।बैकबोन.जेएस

समस्या यह है, यदि उपयोगकर्ता ने ब्राउज़र में यूआरएल टाइप करके (गूगल) की तरह एक और यूआरएल से उस पृष्ठ (एप्लिकेशन # सेटिंग्स) के लिए सीधे चला गया, मुझे मुख पृष्ठ पर उपयोगकर्ता रीडायरेक्ट करना चाहते हैं (एप्लिकेशन /) Google पर वापस जाने के बजाय।

मैं ऐसा करने के लिए किसी भी तरह से पता लगाने में सक्षम नहीं हूं। बैकबोन.history ऐसा लगता है कि यह ब्राउज़र के बैक बटन से जानकारी संग्रहीत करता है, इसलिए इसका इतिहास है भले ही वे ऐप पर पहुंचे। मुझे पिछले यूआरएल को देखने का कोई तरीका नहीं मिला।

क्या यह संभव है?

उत्तर

24

अपने स्वयं के तरीके में बैक नेविगेशन तर्क लपेटें।

var AppRouter = Backbone.Router.extend({ 

    initialize: function() { 
    this.routesHit = 0; 
    //keep count of number of routes handled by your application 
    Backbone.history.on('route', function() { this.routesHit++; }, this); 
    }, 

    back: function() { 
    if(this.routesHit > 1) { 
     //more than one route hit -> user did not land to current page directly 
     window.history.back(); 
    } else { 
     //otherwise go to the home page. Use replaceState if available so 
     //the navigation doesn't create an extra history entry 
     this.navigate('app/', {trigger:true, replace:true}); 
    } 
    } 
}); 

और वापस नेविगेट करने के रूटर विधि का उपयोग करें: शायद रूटर पर routesHit:

appRouter.back(); 
+5

यह दृष्टिकोण ब्राउजर बैक नेविगेशन सहित प्रत्येक मार्ग की गणना करता है। मान लें कि मैं अपने ऐप के अंदर 3 रूटों पर जा रहा हूं, फिर रूट्स 3 होगा। अब ब्राउजर बैक बटन का उपयोग करने से मार्ग कम नहीं होंगे (बल्कि इसे बढ़ाता है) और ब्राउज़र अंततः आपको अपने ऐप से बाहर ले जाएगा। –

3

मैं jevakallio से एक ही जवाब का इस्तेमाल किया है, लेकिन मैं एक ही समस्या है कि टिप्पणीकार जे कुमार था इसलिए appRouter.back() पर्याप्त बार मार उपयोगकर्ता एप्लिकेशन से बाहर ले जाएगा घटाना नहीं है, तो मैं 3 लाइनों कहा:

var AppRouter = Backbone.Router.extend({ 

    initialize: function() { 
    this.routesHit = 0; 
    //keep count of number of routes handled by your application 
    Backbone.history.on('route', function() { this.routesHit++; }, this); 
    }, 

    back: function() { 
    if(this.routesHit > 1) { 
     //more than one route hit -> user did not land to current page directly 
     this.routesHit = this.routesHit - 2; //Added line: read below 
     window.history.back(); 
    } else { 
     //otherwise go to the home page. Use replaceState if available so 
     //the navigation doesn't create an extra history entry 
     if(Backbone.history.getFragment() != 'app/') //Added line: read below 
     this.routesHit = 0; //Added line: read below 
     this.navigate('app/', {trigger:true, replace:true}); 
    } 
    } 
}); 

और ro का उपयोग uter विधि वापस नेविगेट करने के:

appRouter.back(); 

जोड़ा लाइनों:

1 एक: routesHit से 2 घटाएँ, तो "वापस" पेज यह 1 प्राप्त करेंगे करने के लिए जब अपने पुनः निर्देशित इसलिए यह वास्तव में है जैसे आप अभी किया एक शून्य 1.

दूसरा: यदि उपयोगकर्ता पहले से ही "घर" पर है, तो कोई रीडायरेक्ट नहीं होगा इसलिए routesHit पर कुछ भी न करें।

तीसरा एक: यदि उपयोगकर्ता कहां से शुरू हुआ है और उसे "घर" पर भेजा जा रहा है, तो routesHit = 0 सेट करें, फिर जब "घर" routesHit पर रीडायरेक्ट किया जाए तो 1 फिर से होगा।

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