烬路线在错误加载模型后卡住

Ember Route gets stuck after error loading model

本文关键字:模型 加载 错误 烬路      更新时间:2023-09-26

在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. 路由的模型方法返回一个拒绝的promise,我被踢出登录界面
  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()

<<h3>验证url/h3>

另一种合理的方法是在哈希状态中放置一个随机的唯一id。基本上就是这样做。

代替像

这样的路由

#/contacts/1

为每条经过认证的路由加上某种唯一的id

#/PyUE4E+JEdOaDAMF6CwzAQ/contacts/1

App.reset

我尝试了很多事情。我尝试的一个更有希望的事情是重定向到登录屏幕,并在我的全局App对象上使用应用程序的reset方法。http://emberjs.com/api/classes/Ember.Application.html method_reset

这不起作用,似乎即使是重置应用程序也会记住它已经解决的任何路由的模型-奇怪。