烬路线在错误加载模型后卡住
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');
}
}
}
});
- 我导航到
/users
路线 - 由于某种原因,我的令牌过期(不活动,无论如何…)
- 我导航到
/users/1
路线 - 路由的模型方法返回一个拒绝的promise,我被踢出登录界面
- 我重新登录并尝试导航回
/users/1
路由 - 路由自动返回与上次相同的失败承诺,我被踢出登录屏幕。(
/users
路线/users/1
路线/users/1
路由我在想我想要的是在用户登录后清除所有评估的路由模型的方法。如果这是一个多用户系统,一个用户退出,另一个用户在同一台计算机上登录,没有刷新页面,那么新用户不应该有从前一个用户的会话中自动解析的路由。
这似乎对我来说,这将是一个常见的问题,但我找不到任何类型的应用程序范围内的无效缓存方法。我该如何解决这个问题?
我不确定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
对象上使用应用程序的reset
方法。http://emberjs.com/api/classes/Ember.Application.html method_reset
这不起作用,似乎即使是重置应用程序也会记住它已经解决的任何路由的模型-奇怪。
- 如何将本地json数据加载到Extjs数据模型中
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- ThreeJS访问加载的obj模型中的对象
- Sails.js:我可以将一些服务/模型打包为npm并在Sails.jss应用程序中加载npm吗
- 如何在three.js中加载指定文件内容而非路径的三维模型
- 如何加载一次模型并将其存储到变量中
- 加载 .dae 模型时不显示纹理
- Webgl 加载 json 模型问题
- 延迟 AngularJS 路由更改,直到加载模型以防止闪烁
- 如何在打开模型时动态加载控制器文件
- 加载模型与三个.js
- 三.js:如何从Web-worker加载动画.json模型
- 如何在角度 2 中向动态加载的子组件提供父组件的模型
- EmberJS:如何在同一条路径上加载多个模型
- 挖空映射:加载数据后,父模型中的计算可观察量不会更新
- AngularJS-关闭tile并从ngRepeat指令AngularJS中的模型加载新视图
- 在Ember.js中渲染应用程序之前,正在等待模型加载
- 使用Ajax从数据库/模型加载数据
- 当我把模型加载到three.js中时,我怎样才能提高性能呢?
- Kendo UI下拉菜单从模型加载数据