2015-12-29 12 views
6

नहीं बदल रहा है, मैं ui-राउटर के साथ Angular.js 1.3 का उपयोग कर रहा हूं। मेरे पास 3 पेज हैं, पेज 1.html, पेज 2.html, पेज 3.html।

जब उपयोगकर्ता पेज 1 पर क्लिक करता है, तो पेज 2 खुल जाएगा, लेकिन मैं पृष्ठ 1 की स्क्रॉल स्थिति को सहेजना चाहता हूं, जहां उपयोगकर्ता क्लिक करने से पहले था, ताकि बैक बटन पर क्लिक करने के बाद वह उसी स्क्रॉल स्थिति पर उतर सके।

इसे सुलझाने के लिए मैं iframe में, page1.html से अधिक page2.html खोला, और यह page1.html में प्रदर्शन के लिए निरपेक्ष स्थिति दे रही है, और मैं उपयोग कर रहा हूँ:

history.pushState({}, '', '/page2.html');

यूआरएल बदलने के लिए। यह कार्यान्वयन ठीक काम कर रहा है।

अब उपयोगकर्ता page2.html पर दिए गए लिंक पर क्लिक करते हैं, यह page3.html खोलना चाहिए, एक सामान्य लिंक, जिसके लिए मैं प्रयोग किया जाता है जैसे:

$state.go("page3") 

समस्या अब राज्य प्रभार है, और पृष्ठ 3 एचटीएमएल लोड, लेकिन यूआरएल अभी भी /page2.html है, यूआरएल बदल नहीं रहा है।

मैं भी करने की कोशिश की:

history.pushState({}, '', '/page3.html'); 

फिर भी यूआरएल में बदलाव नहीं किया गया है। कोई भी जानता है कि यह क्यों हो रहा है।

+0

मुझे यकीन नहीं है कि यह काम करेगा।लेकिन मुझे लगता है कि आप 'इफ्रेम' में हैं इसलिए यही यूआरएल नहीं बदल रहा है। जब आप पेज 2 में हों तो क्या आप 'eval' आज़मा सकते हैं। हो सकता है 'parent.eval ($ state.go (" page3 ")) 'ऐसा कुछ। –

+0

क्या आप एक JSFiddle पोस्ट कर सकते हैं? –

+0

क्षमा करें मैं इसे jsfiddle पर पोस्ट नहीं कर सकता। लेकिन हाँ, मैं समझ सकता हूं कि लिंक आईफ्रेम में है, यही कारण है कि यह यूआरएल (शायद) नहीं बदल रहा है। लेकिन जेएस कोड ठीक चल रहा है, history.pushState चल रहा है (जेएस स्रोत डीबगर), लेकिन इसका यूआरएल पर कोई प्रभाव नहीं पड़ता है। Iframe के बारे में अधिक खोद जाएगा। –

उत्तर

0

भले ही आप जिस समाधान को कार्यान्वित करने की कोशिश कर रहे हैं वह बहुत रचनात्मक है, मैं वास्तव में एक और दिशा चुनूंगा।

आपके पास कई विकल्प हैं, जिनमें से सभी स्क्रॉल स्थिति को कहीं भी कैशिंग पर भरोसा करते हैं। उदाहरण के लिए:

var scrollTopData = {}; 

function changeState (toState) { 
    var currentStateName = $state.current.name; 
    scrollTopData[currentStateName] = window.scrollY; 
    $state.go(toState); 
} 

तब सवाल यह है कि आपके द्वारा कैश किए गए स्क्रॉल स्थिति के साथ क्या करना है। $state.go एक वादा देता है, तो एक समाधान होगा:

var scrollTopData = {}; 

function changeState (toState) { 
    var currentStateName = $state.current.name; 
    scrollTopData[currentStateName] = window.scrollY; 

    $state.go(toState).then(function() { 
     if (toState in scrollTopData) { 
      window.scrollTo(0, scrollTopData[toState]); 
     } 
    }); 
} 

आपके क्रियान्वयन के आधार, आप भी asgoth के जवाब इस्तेमाल कर सकते हैं:

मैं इसे पहले उपयोग नहीं किया है, लेकिन कोणीय एक है $anchorScroll सेवा। डेटा को पुनः लोड करने के लिए, आप इसे $cacheFactory का उपयोग करके कैश कर सकते हैं, या डेटा को उच्च दायरे पर संग्रहीत कर सकते हैं।

एक और समाधान stateChangeEvent का उपयोग करना होगा। उदाहरण के लिए:

$rootScope.$on('$stateChangeSuccess', 
    function (event, toState, toParams, fromState, fromParams) { 
     // Do magic 
    } 
); 

मेरी सलाह $state.go द्वारा दिए गए वादे का उपयोग करना होगा।

+0

हाँ इस जानकारी के लिए धन्यवाद। लेकिन मेरी परियोजना में अनंत स्क्रॉल शामिल है: पहले लोड पर, एपीआई पहले 20 उत्पाद देता है, फिर अगले 20 में स्क्रॉल पर आता है, इसलिए यदि उपयोगकर्ता तीसरे बार स्क्रॉल हो गया है और आइटम पर क्लिक करता है, तो बैक बटन दबाएं, एपीआई को शुरू करने से बुलाया जाता है, इसलिए स्क्रॉल पॉइंट सहेजना उपयोगी नहीं है, क्योंकि डेटा उपलब्ध नहीं है। मेरा वर्तमान समाधान शीर्ष पर क्लिक किए गए पृष्ठ को दिखाता है, इस प्रकार पॉपस्टेट पर इसे हटाकर एपीआई हिट को फिर से बचाता है और यह पहले की तरह ही स्थिति में रहता है। –

+0

अच्छी तरह से जानकारी उत्तर देने से पहले आसानी से आती है :) वैसे भी, अवधारणा एक ही है, इसके अलावा अवधारणा एक ही है: आप उस पेज नंबर को डाल सकते हैं जिसका उपयोग आप हैंश पथ में अधिक लेख लोड करते समय करते हैं। जब अनंत स्क्रॉलिंग पृष्ठ लोड होता है, तो पृष्ठ संख्या की जांच करें, उस पर सब कुछ लोड करें और विंडो को अंतिम ज्ञात स्क्रॉल स्थिति पर स्क्रॉल करें। – pesla

0

यदि आप कोणीय के डिफ़ॉल्ट व्यवहार को बदलते हैं तो आप url में कोई परिवर्तन नहीं कर सकते हैं। हैश के बाद यूआरएल में हिस्सा स्वचालित रूप से बदल जाता है। क्योंकि आप /somepage.html को

/#somepage.html

टिप्पणी हैश (#) यहाँ जोड़ा जैसे कुछ बात की कोशिश ब्राउज़र मजबूर आप को बदलने यूआरएल नहीं है।

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