簡體   English   中英

在 Ember.js 中重新導航到當前路線

[英]Renavigating to current route in Ember.js

因此,在身份驗證和轉換方面似乎有一個既定的模式。

在轉換時檢查身份驗證 -> 會話已過期 -> 存儲的嘗試轉換 -> 重定向到登錄 -> 成功登錄 -> 重試嘗試轉換

我們已經實現了這一點,並且運行良好。 現在我們想知道當操作包含例如由於會話過期導致身份驗證失敗的休息調用時該怎么辦? 在這里,我們想像轉換一樣重定向到登錄,但問題是我們如何到達我們之前在應用程序中的位置? 存儲 routeName 是不夠的,因為可能存在動態段。 后台是否有任何 ember 對象存儲當前路由,包括 url 參數?

好的,為了慶祝我找到了我記得之前也搜索過的Transition 源代碼,我繼續在我正在開發的 Ember 應用程序中為您測試了它。 簡而言之,是的,您可以隨時retry()存儲的轉換,因此我的建議是始終存儲最新的轉換,然后在會話到期的情況下在必要時retry 好吧,無論如何,最新的有用轉換,您到登錄路由等的轉換當然應該被忽略。

您甚至可以像我剛才那樣使用類似的相對快速的安排。 在我的應用程序路由routes/application.js ,我添加了以下操作處理程序

actions: {
    willTransition: function(transition) {
        this.set('_latestTransition', transition);
    },
    saveTransition: function() {
        var transition = this.get('_latestTransition');
        console.log('transition saved', transition);
        this.set('_transitionSnapshot', transition);
    },
    retryTransition: function() {
        var transition = this.get('_transitionSnapshot');
        console.log('transition retry', transition);
        transition.retry();
    }
}

然后,對於我的測試,我只是在始終可見的菜單中添加了兩個按鈕:一個觸發saveTransition操作,另一個觸發retryTransition操作。 結果是,正如我已經被寵壞的那樣,在單擊我的保存按鈕,然后進行其他幾個轉換,然后單擊重試按鈕后,我回到了第一次單擊保存按鈕時的頁面。 動態部分很好; 我在任何地方都沒有使用查詢參數,因此測試這些參數的速度不夠快,我無法打擾,但Transition對象顯然也包含這些參數。

由於這些動作處理程序駐留在應用程序路由中,只要應用程序中沒有其他任何內容處理這些名稱的動作(或者特別是在willTransition情況下,動作通過返回true被冒泡),它們將在此處得到處理。 如上所述,您可以自己使用這種方法,或者根據您的需要和評論中的建議使用某些服務中介來存儲必要的轉換。

看看這個指南。 尤其是您需要的“存儲和重試轉換”部分。

編輯:

如果您正在尋找會話服務實現,請查看ember-simple-auth的會話服務。

我假設您正在使用 ember-simple-auth。 在這種情況下,嘗試在您的應用程序路由中添加以下代碼:

actions: {
    error: function (error, transition) {
        /**
         * Handle 401 error during model hook
         */
        if (error.errors !== undefined) {
            for (var i = 0; i < error.errors.length; i++) {
                if (error.errors[i].status !== undefined) {
                    if (parseInt(error.errors[i].status) === 401) {
                        transition.abort();
                        this.set('session.attemptedTransition', transition);
                        this.transitionTo('login');
                        return false;
                    }
                }
            }
        }

        return true;
    }
}

這條重要的線this.set('session.attemptedTransition', transition); 我從經過驗證的路由混合中獲取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM