वर्तमान स्थिति को पुनः लोड कैसे करें?


333

मैं कोणीय यूआई राउटर का उपयोग कर रहा हूं और वर्तमान स्थिति को फिर से लोड करना चाहता हूं और वर्तमान राज्य के लिए सभी डेटा को फिर से चालू / नियंत्रित करना चाहता हूं और यह माता-पिता है।

मेरे पास 3 राज्य स्तर हैं: Directory.organisations.details

directory.organisations में संगठनों की सूची के साथ एक तालिका होती है। तालिका में एक आइटम पर क्लिक करने से निर्देशिका लोड हो जाती है। पुनर्गठन ।.details $ StateParams के साथ आइटम का आईडी पास करना। इसलिए विवरण स्थिति में मैं इस आइटम के लिए विवरण लोड करता हूं, उन्हें संपादित करता हूं और फिर डेटा सहेजता हूं। सब ठीक है अब तक।

अब मुझे इस स्थिति को फिर से लोड करने और सभी डेटा ताज़ा करने की आवश्यकता है।

मैंने कोशिश की है:

 $state.transitionTo('directory.organisations');

जो मूल स्थिति में चला जाता है, लेकिन नियंत्रक को फिर से लोड नहीं करता है, मुझे लगता है क्योंकि रास्ता नहीं बदला है। आदर्श रूप से मैं सिर्फ डायरेक्टरी में रहना चाहता हूं। पुनर्गठन। राज्य की स्थिति और माता-पिता के सभी डेटा को भी ताज़ा करते हैं।

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

$state.reload()

मैंने इसे API WIKI पर $ state.reload के लिए देखा है "(बग को अभी ठीक करने वाले नियंत्रकों के साथ (जल्द ही ठीक करना)।"

किसी भी सहायता की सराहना की जाएगी?


7
मैंने इसे इस प्रकार हल किया है: $ state.transitionTo ($ state.current, $ stateParams, {reload: true, inherit: false, अधिसूचित: true});
हॉलैंड रिस्ले

1
इस कोड को कहां जोड़ा जाए?
मनोज जी

तो बग अभी तय है? github.com/angular-ui/ui-router/wiki/…
jchnxu

कोड को कहां $state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})जोड़ा जाना चाहिए ? मेरे राज्यों के साथ फिर से वही समस्या होने से डेटा का सभी खो रहा है।
इवान बर्बिज

जवाबों:


565

मैंने पाया कि यह ui- राउटर के साथ रिफ्रेश करने का सबसे छोटा तरीका है:

$state.go($state.current, {}, {reload: true}); //second parameter is for $stateParams

नए संस्करणों के लिए अपडेट करें :

$state.reload();

जो के लिए एक उपनाम है:

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: true
});

प्रलेखन: https://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state#methods_reload


21
शायद यह ध्यान देने योग्य है कि इनमें से कोई भी वास्तव में पृष्ठ को पुनः लोड नहीं करता है। यदि आप राज्य और पृष्ठ को पुनः लोड करना चाहते हैं, तो इसके लिए कोई ui-routerतरीका नहीं है जो मुझे लगता है। करते हैं window.location.reload(true)
सिंपलजी

15
यदि आप इसके बारे में अधिक कोणीय होना चाहते हैं तो @SimpleAsCouldBe $window.location.reload();। हालांकि यह थोड़ा अधिक लगता है कि यह परीक्षण / मज़ाक कर सकता है / सभी निर्भरता जानने के बाद कोड का एक टुकड़ा चीजों को थोड़ा आसान बना देता है।
एडहेडेज

1
बस जिज्ञासु, वास्तव में "$ state.current" का क्या मतलब है? मैं यूआई-राउटर के एपीआई पर स्पष्ट स्पष्टीकरण नहीं देख सकता, किसी भी मदद की सराहना की जाएगी, धन्यवाद!
user2499325

3
@ user2499325: $ state.current आपके पास मौजूद सभी डेटा के साथ एक ऑब्जेक्ट लौटाता है जो आपके पास है। /new.place/new.place.details.html ", नाम:" index.places.placeDetails "}}` ``
जेवियर हनीकौट

1
यदि आप पहले से ही इस तरह के रूप में लोड मापदंडों: $ State.go ($ state.current, $ stateParams, {reload: true}) के साथ {} को प्रतिस्थापित कर सकते हैं;
tsuz

154

यह समाधान AngularJS V.1.2.2 में काम करता है:

$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});

8
आप इसे कहां जोड़ेंगे ताकि यह एक अनंत लूप का कारण न बने।
पथ्सोफिसिग्न

5
क्या इससे resolveराज्य की वस्तुओं का फिर से समाधान होगा ?
शारपीओने

7
इसके अलावा, यदि आप उस कॉल को $ अवस्था में बदलते हैं, तो आपको $ StateParams को इंजेक्ट नहीं करना होगा ।params
Jeff Ancel

4
वर्तमान उच्चतम मत वाले उत्तर की तुलना में बहुत बेहतर काम करता है, वास्तव में पृष्ठ को फिर से लोड करता है। यदि आपके पास अनंत लूप समस्या है, तो आपका पुनः लोड संभवतः गलत जगह पर है। मैं केवल एक बटन क्लिक पर इसका उपयोग कर रहा हूं
दान

2
@ManojG के लिए थोड़ा देर से लेकिन आप इस कोड को कहीं भी रख सकते हैं आपको फिर से लोड करने की आवश्यकता है - शायद एक एनजी-क्लिक निर्देश समारोह या अन्य घटना में। यह स्पष्ट कारणों (अनंत लूप) के लिए हर पृष्ठ लोड पर नहीं किया जाना चाहिए
sricks

68

यह अंतिम समाधान होगा। (@ Hollan_Risley की पोस्ट से प्रेरित)

'use strict';

angular.module('app')

.config(function($provide) {
    $provide.decorator('$state', function($delegate, $stateParams) {
        $delegate.forceReload = function() {
            return $delegate.go($delegate.current, $stateParams, {
                reload: true,
                inherit: false,
                notify: true
            });
        };
        return $delegate;
    });
});

अब, जब भी आपको पुनः लोड करने की आवश्यकता हो, बस कॉल करें:

$state.forceReload();

6
मृत्यु का inifinit पाश
CS

6
लगता है कि आपके पास कहीं एक इंटरसेप्टर है जो ट्रिगर हो जाता है। मैंने कई बार इस समाधान का परीक्षण किया है और यह ठीक काम करता है।
MK

2
@MK उस नोट के लिए धन्यवाद। इसने मुझे अपने स्वयं के समाधान की ओर अग्रसर किया, अलग समस्या। मैंने यह जानने में घंटों की कोशिश की कि मेरे अनुरोध दोगुने क्यों हो रहे हैं, फिर तीन गुना हो गए हैं और यह सब एक इंटरसेप्टर ( github.com/witoldsz/angular-http-auth ) के कारण हुआ।
मैकिज पगड़ी

57

आयनिक ढांचे के लिए

$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload

$stateProvider.
  state('home', {
    url: '/',
    cache: false, //required

https://github.com/angular-ui/ui-router/issues/582


मेरे लिए ठीक काम करता है जहां $state.goएक नए राज्य में पुनर्निर्देशित करने में विफल रहा। धन्यवाद @RouR मेरा दिन बचाया।
गिलोयूम वूइप

मुझे लगता है कि $ State.go को $ State.transitionTo से बदल दें। तो जहाँ भी आप $ state.go को कॉल कर रहे थे, बस उसे बदल दें। यह $ State.transitionTo ('टैब-नेम', {key: value}, {reload: true, inherit: true, अधिसूचित: true} जैसे कुछ दिख सकता है
Bill Pope

2
कैश: झूठी चाल करता है .. लेकिन यह प्रदर्शन को कितना प्रभावित करता है?
FrEaKmAn

$ state.go को $ state.transition के साथ बदलें राज्य को बदलने और पुनः लोड करने के लिए @ ManojG
Gery

क्या मुझे उपयोग करने के लिए कुछ नई लाइब्रेरी शामिल करनी होगी $state? मैं आयनिक १.४.०, कोणीय १.५.३
जॉसिनलो

45

संभवतः क्लीनर दृष्टिकोण निम्नलिखित होगा:

<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>

हम केवल HTML से राज्य को पुनः लोड कर सकते हैं।


7
आप पूरे पृष्ठ को फिर से लोड करने से बचने के लिए ui-sref-opts = "{reload: 'child.state'}" का भी उपयोग कर सकते हैं, जहां 'child.state' एक स्ट्रिंग है जो आपकी वास्तविक स्थिति का प्रतिनिधित्व करता है।
माइकल फुल्टन

21

@ हॉलैंड रिस्ले का जवाब अब नवीनतम यूआई-राउटर में एपीआई के रूप में उपलब्ध है।

$state.reload();

एक विधि जो वर्तमान स्थिति को पुनः लोड करती है। सभी समाधानों को फिर से हल किया जाता है, नियंत्रकों को बहाल किया जाता है, और घटनाओं को फिर से निकाल दिया जाता है।

http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state




7

अगर आप अपने पूरे पृष्ठ को फिर से लोड करना चाहते हैं, तो ऐसा लगता है, बस $ विंडो को अपने नियंत्रक में इंजेक्ट करें और फिर कॉल करें

$window.location.href = '/';

लेकिन अगर आप केवल अपने वर्तमान दृश्य को पुनः लोड करना चाहते हैं, तो $ स्कोप, $ स्थिति और $ स्टेटप्रेम (बाद वाले को इस स्थिति में पुनः लोड करने के लिए कुछ पैरामीटर बदलने की आवश्यकता है, जैसे कि आपके पेज नंबर की तरह) को इंजेक्ट करें, फिर इसे किसी भी कॉल करें नियंत्रक विधि:

$stateParams.page = 1;
$state.reload();

AngularJS v1.3.15 कोणीय-उई-राउटर v0.2.15


6

मूर्खतापूर्ण वर्कअराउंड जो हमेशा काम करता है।

$state.go("otherState").then(function(){
     $state.go("wantedState")
});

3

कोणीय v1.2.26 के लिए, उपरोक्त कार्यों में से कोई भी नहीं। राज्य पुनः लोड करने के लिए उपरोक्त विधियों को कॉल करने वाली एनजी-क्लिक को दो बार क्लिक करना होगा।

इसलिए मैंने $ टाइमआउट का उपयोग करके 2 क्लिकों का अनुकरण किया।

$provide.decorator('$state',
        ["$delegate", "$stateParams", '$timeout', function ($delegate, $stateParams, $timeout) {
            $delegate.forceReload = function () {
                var reload = function () {
                    $delegate.transitionTo($delegate.current, angular.copy($stateParams), {
                        reload: true,
                        inherit: true,
                        notify: true
                    })
                };
                reload();
                $timeout(reload, 100);
            };
            return $delegate;
        }]);

नेविगेशन .reload () को Angular 1.3.0-rc0 के साथ दो क्लिक्स की आवश्यकता थी, लेकिन ट्रांज़िशनट () ने ठीक काम किया। हो सकता है कि अगर आपके पास यह समस्या है तो अपग्रेड करने की कोशिश करें
sricks

3

मेरे लिए सब कुछ विफल रहा। केवल एक चीज जो काम की है ... कैश-व्यू = "झूठी" को उस दृश्य में जोड़ रही है, जिसे मैं इसे जाने पर पुनः लोड करना चाहता हूं।

इस अंक से https://github.com/angular-ui/ui-router/issues/582


3
आपको यह जोड़ना चाहिए कि यह आयनिक के लिए है
लद्मेरक

3

यकीन नहीं होता कि इनमें से कोई भी मेरे लिए काम क्यों नहीं करता था; अंत में जो किया वह था:

$state.reload($state.current.name);

यह एंगुलर 1.4.0 के साथ था


2

मेरे पास कई नेस्टेड विचार थे और लक्ष्य केवल एक सामग्री के साथ पुनः लोड करना था। मैंने विभिन्न तरीकों की कोशिश की लेकिन मेरे लिए काम करने वाली एकमात्र चीज़ है:

//to reload
$stateParams.reload = !$stateParams.reload; //flip value of reload param
$state.go($state.current, $stateParams);

//state config
$stateProvider
  .state('app.dashboard', {
    url: '/',
    templateUrl: 'app/components/dashboard/dashboard.tmpl.html',
    controller: 'DashboardController',
    controllerAs: 'vm',
    params: {reload: false} //add reload param to a view you want to reload
  });

इस मामले में केवल आवश्यक दृश्य को फिर से लोड किया जाएगा और कैशिंग अभी भी काम करेगा।


सही या गलत को पुनः लोड करें, यू को गलत बताया गया है। गलत सामग्री को नवीनतम परिवर्तनों के साथ पुनः लोड करेगा?
deadend

2

मुझे पता है कि जवाबों का एक गुच्छा रहा है, लेकिन जिस तरह से मैंने एक पूर्ण पृष्ठ ताज़ा किए बिना ऐसा करने के लिए पाया है, उस मार्ग पर एक डमी पैरामीटर बनाना है जिसे मैं ताज़ा करना चाहता हूं और फिर जब मैं मार्ग को कॉल करता हूं, तो मैं पास हो जाता हूं डमी पैरामेटर के लिए यादृच्छिक संख्या।

            .state("coverage.check.response", {
                params: { coverageResponse: null, coverageResponseId: 0, updater: 1 },
                views: {
                    "coverageResponse": {
                        templateUrl: "/Scripts/app/coverage/templates/coverageResponse.html",
                        controller: "coverageResponseController",
                        controllerAs: "vm"
                    }
                }
            })

और फिर उस मार्ग पर कॉल करें

$state.go("coverage.check.response", { coverageResponse: coverage, updater: Math.floor(Math.random() * 100000) + 1 });

एक आकर्षण की तरह काम करता है और हल को संभालता है।


2

आप @Rohan उत्तर https://stackoverflow.com/a/23609343/3297761 का उपयोग कर सकते हैं

लेकिन अगर आप एक दृश्य परिवर्तन के बाद प्रत्येक नियंत्रक को पुनः लोड करना चाहते हैं तो आप उपयोग कर सकते हैं

myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }

2

यदि आप आयनिक v1 का उपयोग कर रहे हैं, तो उपरोक्त समाधान काम नहीं करेगा क्योंकि आयनिक ने $ आयनिककोनफिगरप्रोइडर के हिस्से के रूप में टेम्पलेट कैशिंग को सक्षम किया है।

इसके लिए आस-पास का काम थोड़ा हैक है - आपको कैश को 0 आयनिक.ंगलुलर.जेएस फ़ाइल में सेट करना होगा:

$ionicConfigProvider.views.maxCache(0);

1

मुझे यह समस्या थी कि यह मेरे सिर को बर्बाद कर रहा था, मेरी रूटिंग को JSON फ़ाइल से पढ़ा जाता है और फिर एक निर्देश में खिलाया जाता है। मैं एक यूआई-स्टेट पर क्लिक कर सकता हूं लेकिन मैं पेज को फिर से लोड नहीं कर सकता। तो मेरे एक सहकर्मी ने मुझे इसके लिए एक अच्छी छोटी चाल दिखाई।

  1. अपना डेटा प्राप्त करें
  2. आपके एप्लिकेशन में कॉन्फ़िगरेशन एक लोडिंग स्थिति बनाता है
  3. जिस राज्य में आप जाना चाहते हैं, उसे रूटस्कॉप में सहेजें।
  4. अपने ऐप में अपने स्थान को "लोड / लोड" करें
  5. लोडिंग कंट्रोलर में रूटिंग वादे को हल करें और फिर अपने इच्छित लक्ष्य के लिए स्थान निर्धारित करें।

इसने मेरे लिए काम किया।

आशा है ये मदद करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.