Backbone.js 覆盖主干导航刷新路由

Backbone.js 覆盖主干导航刷新路由,backbone.js,marionette,Backbone.js,Marionette,在特定的层次上,这是一个很好的方法,但是我还没有找到一个好的方法来覆盖将主干路由导航到同一个散列路由的一般情况。 甚至有一些讨论,这就是为什么 具体地说,我有几个在主干应用程序中的modals/dialogs/popover中显示数据的实例,可以在不更改路径的情况下关闭这些实例。在这些情况下,我会继续手动“校正”路径,以避免刷新页面和导航 不幸的是,为了避免这种情况,我想扩展主干以允许这些请求,而不需要任何处理程序响应路径更改的点击。也就是说,我希望保持主干视图的干燥,而不是使用HTML hre

在特定的层次上,这是一个很好的方法,但是我还没有找到一个好的方法来覆盖将主干路由导航到同一个散列路由的一般情况。 甚至有一些讨论,这就是为什么

具体地说,我有几个在主干应用程序中的modals/dialogs/popover中显示数据的实例,可以在不更改路径的情况下关闭这些实例。在这些情况下,我会继续手动“校正”路径,以避免刷新页面和导航

不幸的是,为了避免这种情况,我想扩展主干以允许这些请求,而不需要任何处理程序响应路径更改的点击。也就是说,我希望保持主干视图的干燥,而不是使用HTML href=path

因此,本质上,我正在尝试创建一个主干扩展,它将默认的导航方法覆盖到我们自己的方法。我发现我试图更新,但没有成功。除非出现任何加载顺序问题,我觉得它应该可以工作,但似乎永远都无法触发该代码

      _.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);
    };
目前,我已经运行了一些特定的单击处理程序,这些处理程序只在主干网不响应时才响应,但这不符合我的代码气味标准:

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());
      }
    }
  },
});

有人有任何功能模式来解决这个复杂的问题吗?

在这个问题上令人沮丧的3天后,我决定我不能覆盖主干。历史,由于它是一种奇怪的启动模式,我有限的JavaScript技能并不熟悉,或者我们使用的是木偶网的AppRouter,由于某种原因它不会选择覆盖

无论哪种方式,这个问题都是通过手动关闭模式而不是导航到非模式散列来表现的。通过在非模式散列上手动调用navigate并将窗口重新定位到未注意到闪烁或可见重画之前的位置,可以纠正这一问题

一些代码:

var scrolled_top = window.parent.pageYOffset || window.parent.document.documentElement.scrollTop;
var scrolled_left = window.parent.pageXOffset || window.parent.document.documentElement.scrollLeft;
App.router.navigate('');
window.parent.scrollTo(scrolled_left, scrolled_top); //reset screen location after navigation sets it to top of new view