【发布时间】:2014-09-26 12:18:45
【问题描述】:
这是discusseda lot before,在特定级别上,但我还没有找到一个好的方法来覆盖将主干路由导航到相同哈希路由的一般情况。 甚至还有一些关于why this is a bad idea的讨论,这就是为什么Backbone won'tchange their approach,despite lotsof requests。
具体来说,我有几个在 Backbone 应用程序中显示数据的实例(在模式/对话框/弹出框中),这些实例可以在不更改路径的情况下关闭。在这些情况下,我会继续手动“调整”路径,以免刷新页面并以传统方式导航。
不幸的是,Backbone has some specific code 避免了这种用例,所以我想扩展 Backbone 以允许这些请求,而不需要任何处理程序响应路径更改的点击。也就是说,我想保持 Backbone View 的 DRY 并且 不 manually call a navigate,而只使用 HTML href="#path"。
因此,本质上,我正在尝试创建一个 Backbone 扩展,将它们的默认导航方法覆盖为我们自己的。我发现this example 我尝试更新但没有成功。除非有任何加载顺序问题,我觉得它应该可以工作,但似乎永远无法触发该代码。
_.extend(Backbone.History.prototype, {
refresh: function() {
this.loadUrl(this.fragment);
}
});
var routeStripper = /^[#\/]/;
var origNavigate = Backbone.History.prototype.navigate;
Backbone.History.prototype.navigate = function (fragment, options) {
var frag = (fragment || '').replace(routeStripper, '');
if (this.fragment == frag)
this.refresh();
else
origNavigate.call(this, fragment, options);
};
目前,我已经运行了一些特定的点击处理程序,它们仅在 Backbone 没有响应时才响应,但这不符合我的代码嗅觉标准:
AView = Backbone.Marionette.ItemView.extend({
template: HandlebarsTemplates['a/template'],
initialize: function (data) {
...
},
events: {
'click a[href]': function(event) {
var routeStripper = /^[#\/]/;
var new_frag = ($(event.target).attr("href") || '').replace(routeStripper, '');
if(new_frag == Backbone.history.getFragment()) {
Backbone.history.loadUrl(Backbone.history.getFragment());
}
}
},
});
有没有人有任何功能模式来解决这个令人费解的极端情况?
【问题讨论】: