2011-12-07 15 views
8

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

उत्तर

14

आप Backbone.Router का विस्तार और नेविगेशन के दौरान सभी मार्गों भंडारण के द्वारा इस समस्या को हल कर सकते हैं।

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
    @on "all", @storeRoute 
    @history = [] 
    super options 

    storeRoute: -> 
    @history.push Backbone.history.fragment 

    previous: -> 
    if @history.length > 1 
     @navigate @history[@history.length-2], true 

फिर, आप अपने मॉडल को खारिज करने के लिए है जब, बस MyRouter.previous() विधि है कि यह तुम वापस पिछले "हैश" पर रीडायरेक्ट करेगा कहते हैं।

+3

वास्तव में आप केवल छेद इतिहास – mateusmaso

+0

धन्यवाद के बजाय अंतिम "हैश" स्टोर कर सकते हैं! ठीक वही जो मेरे द्वारा खोजा जा रहा था। – Felipe

+0

मुझे विश्वास नहीं है कि यह गारंटी देगा कि स्टोर रूट विधि को हमेशा रूटिंग विधि से पहले बुलाया जाएगा जो इसका उपयोग कर सकता है। नतीजतन, इतिहास में संग्रहीत क्या संगत नहीं होगा। – DrewB

-2

दिखाया है, आप अपने पॉपअप या ओवरले के ऑनक्लोसेवेंट में एक मार्ग ट्रिगर कर सकते हैं :

router.navigate('/lasturl/'); 

यह यूआरएल सेट करेगा। यदि आप दूसरे पैरा के रूप में सच हो जाते हैं, तो आप मार्ग क्रिया को निष्पादित करेंगे। अन्यथा पृष्ठ अपरिवर्तित छोड़ा जाएगा।

http://documentcloud.github.com/backbone/#Router-navigate

+8

बेशक, लेकिन फिर सवाल यह है कि, मुझे कैसे पता चलेगा कि आखिरी यूआरएल कौन सा है? क्या बैकबोन एक उपयोगी विधि प्रदान करता है, या मुझे इसे window.history से ले जाना होगा? – user802232

1

मुझे लगता है कि मतेसुस्मो का जवाब अधिकतर सही है, लेकिन गारेनटे के लिए कुछ बदलावों की आवश्यकता है कि आपको हमेशा सही यूआरएल मिल रहा है जिसे आप ढूंढ रहे हैं।

सबसे पहले आप एक beforeRoute विधि सक्रिय करना मार्ग विधि ओवरराइड करने के लिए की जरूरत है:

route: (route, name, callback) => 
    Backbone.Router.prototype.route.call(this, route, name, => 
    @trigger('beforeRoute') 
    callback.apply(this, arguments) 
    ) 

तो फिर तुम घटना बाँध और इतिहास उदाहरण चर इनिशिएलाइज़:

initialize: (options) ->  
    @history = [] 
    @on "beforeRoute", @storeRoute 

के लिए अगला बनाने सहायक तरीकों टुकड़े को संग्रहित करना और पुनर्प्राप्त करना:

storeRoute: => 
    @history.push Backbone.history.fragment 

previousFragment: => 
    @history[@history.length-2] 

अंत में, आप एक अंतिम सहायक विधि की आवश्यकता है जिसे यूआरएल को पुनः लोड किए बिना परिणामी खंड को स्टोर करने के लिए इस्तेमाल किया जा सके। पॉप अप को बंद करते समय आपको इसका उपयोग करने की आवश्यकता है या यदि आपके पास कहीं भी नेविगेट किए बिना पॉप अप हो जाता है तो आपके इतिहास में अपेक्षित खंड नहीं होगा। ऐसा इसलिए है क्योंकि "ट्रिगर: सत्य" के बिना नेविगेट करना, ईवेंट हैंडलर को टुकड़े को स्टोर करने के लिए ट्रिगर नहीं करेगा।

changeAndStoreFragment: (fragment) => 
    @navigate(fragment) 
    @storeRoute() 
0

यह उत्तर प्रश्न का समाधान नहीं कर सकता है, लेकिन यह एक ही समस्या है। मैं पिछले मार्ग पर चुपचाप नेविगेट नहीं कर सका, या पीछे की ओर स्लैश की वजह से एक कस्टम मार्ग। रूट फ़ंक्शंस को ट्रिगर नहीं करने के लिए, {trigger:false} का उपयोग करें, या false डिफ़ॉल्ट व्यवहार के बाद से ट्रिगर का उपयोग न करें, और सुनिश्चित करें कि आपका मार्ग '#/कुछ' (स्लैश नोटिस) के बजाय #something के साथ शुरू होता है, या बैकबोन.जेएस, राउटर भाग के अंदर regEx बदलें।

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