簡體   English   中英

錯誤加載模型后,Ember Route卡住了

[英]Ember Route gets stuck after error loading model

在ember路由的模型回調中異步加載數據時,我遇到了一個惱人的問題。 問題似乎是如果我的路線的模型方法返回一個被拒絕的承諾,那么該路線將永遠不會嘗試重新評估該路線模型。 它只是在下次嘗試轉到該路由時自動返回相同的被拒絕的承諾,甚至沒有嘗試重新獲取數據!

我從這個答案中了解到,當試圖將url轉換為模型時,ember路徑只會調用它的模型方法。 我猜測在具有動態段的路由的情況下,如果之前從未遇到過該特定的動態段,則可以調用它。

這是我在路由器設置中得到的。

window.App = Ember.Application.create({
    LOG_TRANSITIONS: true,
    LOG_TRANSITIONS_INTERNAL: true
});

App.Router.map(function() {
    this.route('login');

    this.resource('users', { path: '/users' }, function() {
        this.resource('user', { path: '/:user_id' });
        this.route('create', { path: '/create' });
    });
});

這是我的路線。

App.UserRoute = Ember.Route.extend({
    model: function(params) {
        // This returns a promise
        return App.User.fetch(params.user_id);
    }
});

我對應用程序路由中的錯誤進行了一些特殊處理,以便由於身份驗證異常而失敗的路由將用戶重定向到登錄屏幕。

App.ApplicationRoute = Ember.Route.extend({
    actions: {
        sessionExpired: function() {
            this.controllerFor('login').set("tokenExpired", true);
            this.transitionTo('login');
        },
        error: function(err) {
            if (err.type === "TokenException") {
                this.send('sessionExpired');
            }
        }
    }
});

問題

  1. 我導航到/users路由
  2. 出於某種原因,我的令牌到期(不活動,無論......)
  3. 我導航到/users/1路線
  4. 路線的模型方法返回一個拒絕的承諾,我被踢出登錄屏幕
  5. 我重新登錄並嘗試導航回/users/1路由
  6. 該路由自動返回上次執行的相同失敗承諾,然后我被踢出登錄屏幕。 :(

我想我想要的是在用戶登錄后清除所有評估的路由模型的某種方式。如果這是一個多用戶系統,一個用戶注銷而另一個用戶登錄同一台計算機而不刷新頁面那么新用戶不應該從前一個用戶的會話中自動解析路由。

在我看來這似乎是一個常見的問題,但我找不到任何類型的應用程序范圍的無效緩存方法。 我該怎么解決這個問題?

我不確定ember數據在緩存清除功能上的位置,但這是一種方法

clearCache: function (type) {
  var map = App.store.typeMapFor(type);
  map.idToCid = {};
  map.clientIds = [];
  map.recordArrays = [];
  map.findAllCache = null;
}

這里有一個關於ember firebase庫如何使用緩存清除處理失敗查找的示例。

  delete store.typeMapFor(store.modelFor('user')).idToRecord[username];

完整示例: https//github.com/firebase/emberFire/blob/master/examples/blog/js/app.js

對於任何發現這一點的人 - 我從未找到重置ember應用程序的方法並導致它忘記所有已解析的路由。 我確實找到了其他一些解決方法。

最后,只要用戶退出系統或身份驗證令牌過期,我就選擇window.reload()

經過驗證的網址

另一種合理的方法是在哈希狀態中放置一個隨機唯一ID。 基本上就是這樣做。

而不是像這樣的路線:

#/contacts/1

使用某種唯一ID為每個經過身份驗證的路由添加前綴

#/PyUE4E+JEdOaDAMF6CwzAQ/contacts/1

App.reset

我嘗試了很多東西。 我嘗試過的更有前途的事情之一是重定向到登錄屏幕並在我的全局App對象上使用Application的reset方法。 http://emberjs.com/api/classes/Ember.Application.html#method_reset

雖然這沒有用,似乎即使重置應用程序也記得它已經解決的任何路由的模型 - 很奇怪。

暫無
暫無

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

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