在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');
}
}
}
});
/users
路线/users/1
路线/users/1
路线我认为我想要的是在用户登录后清除所有评估的路由模型的某种方式。如果这是一个多用户系统并且一个用户注销而另一个用户在同一台计算机上登录刷新页面然后新用户不应该从前一个用户的会话中自动解析路由。
在我看来,这似乎是一个常见的问题但我找不到任何类型的应用程序范围的无效缓存方法。我该怎么解决这个问题?
答案 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
我尝试了很多东西。我尝试过的更有前途的事情之一是重定向到登录屏幕并在我的全局reset
对象上使用应用程序的App
方法。 http://emberjs.com/api/classes/Ember.Application.html#method_reset
虽然没有用,但似乎即使重置应用程序也记得它已解决的任何路由的模型 - 很奇怪。