错误加载模型后,Ember Route卡住了

时间:2014-05-08 12:09:34

标签: javascript ember.js

在ember路由的模型回调中异步加载数据时,我遇到了一个烦人的问题。问题似乎是如果我的路线的模型方法返回一个被拒绝的承诺,那么该路线将永远不会尝试重新评估该路线模型。它只是在下次尝试转到该路由时自动返回相同的被拒绝的承诺,甚至没有尝试重新获取数据!

我从this answer了解到,当尝试将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. 该路线自动返回上次执行的失败承诺,我被踢出登录界面。 :(
  7. 我认为我想要的是在用户登录后清除所有评估的路由模型的某种方式。如果这是一个多用户系统并且一个用户注销而另一个用户在同一台​​计算机上登录刷新页面然后新用户不应该从前一个用户的会话中自动解析路由。

    在我看来,这似乎是一个常见的问题但我找不到任何类型的应用程序范围的无效缓存方法。我该怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

我不确定缓存清除功能中的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

答案 1 :(得分:0)

对于任何发现这一点的人 - 我从未找到重置ember应用程序的方法并导致它忘记所有已解析的路径。我确实找到了其他一些解决方法。

最后,在用户退出系统或让其身份验证令牌过期的任何时候,我都选择window.reload()

经过身份验证的网址

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

而不是像

这样的路线

#/contacts/1

使用某种唯一ID

为每个经过身份验证的路由添加前缀

#/PyUE4E+JEdOaDAMF6CwzAQ/contacts/1

App.reset

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

虽然没有用,但似乎即使重置应用程序也记得它已解决的任何路由的模型 - 很奇怪。

相关问题