当涉及到浏览器后退按钮和 emberjs 时,我观察到了不受欢迎的行为。如果用户点击后退按钮,页面会显示两倍渲染的车把模板。
如果历史足够长,甚至可以“工作”几次,页面变得越来越长。有人已经看到了这个问题(甚至解决了它)?
我的应用程序目前与 Trek 在http://trek.github.com/上展示的完全一样,只是我移到了 pre4 的新路由器 API。
版本
- emberjs 1.0 pre4
- 车把 1.0 rc1
当涉及到浏览器后退按钮和 emberjs 时,我观察到了不受欢迎的行为。如果用户点击后退按钮,页面会显示两倍渲染的车把模板。
如果历史足够长,甚至可以“工作”几次,页面变得越来越长。有人已经看到了这个问题(甚至解决了它)?
我的应用程序目前与 Trek 在http://trek.github.com/上展示的完全一样,只是我移到了 pre4 的新路由器 API。
版本
跟进我自己的问题。我的代码中有两个问题。其中一个我追踪并在这里分享解决方案,以防有人遇到类似问题。
我有一个模型定义,例如
App.Member.reopenClass({
allMembers: [],
findAll: function(){
$.ajax({
url: 'https://api.company.com/members',
dataType: 'json',
context: this,
success: function(response){
response.data.forEach(function(member){
this.allMembers.addObject(App.Member.create(member))
}, this)
}
})
return this.allMembers;
}
});
allMembers: []
是保留所有成员的参考。来回时,成员从后端重新加载并再次存储在allMembers
.
要解决这个问题,只需allMembers
定义findAll
:
App.Member.reopenClass({
findAll: function(){
var allMembers = [];
$.ajax({
url: 'https://api.company.com/members',
dataType: 'json',
context: allMembers,
success: function(response){
response.data.forEach(function(member){
this.addObject(App.Member.create(member))
}, this)
}
})
return allMembers;
}
});
第二个问题很可能也与我组合路线的方式有关。一旦我有解决方案,我会在上面发布。
更新,2013-01-22
好的,第二个问题也找到了,emberJS + 后退按钮现在可以正常工作了。同样,我想快速总结一下问题所在,以防有人也被它绊倒。
路由定义如下所示:
App.Router.map(function() {
this.resource("areas", { path: "/areas" });
this.resource("area", { path: "/areas/:refId" }, function() {
this.route("new", { path: "/areas/new" });
});
此外,“new”和“area”使用了相同的视图和控制器。因此,问题出在父路由“区域”及其子路由“新”之间。不建议尝试将所有内容组合在一起,并在控制器内做一些魔术来区分它是哪种情况……
所以,解决方案是:
代码是
App.Router.map(function() {
this.route("areas", { path: "/areas" });
this.route("area", { path: "/areas/:refId" });
this.route("newarea", { path: "/area/new"});
});
就是这样。欣赏或评论。总是很高兴得到专家的意见