Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 非SPA应用程序中的Backbone.js在浏览历史记录时出现问题_Javascript_Backbone.js_Browser History - Fatal编程技术网

Javascript 非SPA应用程序中的Backbone.js在浏览历史记录时出现问题

Javascript 非SPA应用程序中的Backbone.js在浏览历史记录时出现问题,javascript,backbone.js,browser-history,Javascript,Backbone.js,Browser History,我最近开始使用Backbone.js进行开发。在这个应用程序中,我有一个屏幕,可以通过多个过滤器过滤很多行,例如:日期、状态等 问题在于它不是一个SPA(单页应用程序),而是一个使用Backbone.js的单页应用程序。因此,其他页面不使用此框架。仅在这两个路由中(/rows和/rows/search/:params) 当我在这些路径之间浏览时没有问题,它正在加载并且工作得很好。例如,当我浏览/login时会出现问题,这会刷新整个页面,然后单击历史记录返回按钮。当我点击return按钮时,我会看

我最近开始使用Backbone.js进行开发。在这个应用程序中,我有一个屏幕,可以通过多个过滤器过滤很多行,例如:日期、状态等

问题在于它不是一个SPA(单页应用程序),而是一个使用Backbone.js的单页应用程序。因此,其他页面不使用此框架。仅在这两个路由中(
/rows
/rows/search/:params

当我在这些路径之间浏览时没有问题,它正在加载并且工作得很好。例如,当我浏览
/login
时会出现问题,这会刷新整个页面,然后单击历史记录返回按钮。当我点击return按钮时,我会看到
Model.fetch
方法调用的最后一个JSON

我试过一些东西,也许我没有脊椎的方式来获取它

首先,我尝试了
Backbone.history.start({root:'/rows'})
告诉应用程序我只想从此路径上推状态。发生了相同的错误

所以我想这可能是我处理这个国家的方式。因此,我这样做:

App.View.Rows = Backbone.View.extend({
  el: $(document.body),
  events:{ // my events },
  initialize: function() {
    this.model = new App.Collection.Model();
    this.model.bind('reset', this.render, this);
  },
  submitForm: function(ev) {
    ev.preventDefault();
    this.search(ev);
    return false;
  },
  openFilters: function() {
    var el = this.el.find('div.box_content');
    if (!el.is(':visible')) el.slideDown();
  },
  resetFilters: function() {
    window.location.hash = "/rows";
  },
  populate: function(opts) {
    var opts = opts || (opts = {});
    if (this.lastFetch) this.lastFetch.abort();
    this.lastFetch = this.tasks.fetch({data: opts});
  },
  render: function() {
     // logic to render results
  },
  search: function(ev) {
    this.doSearch( this.getFilterOptions() );
  },
  getFilterOptions: function() {
    var opts = //get url params
    return opts;
  },
  doSearch: function( opts ) {
    window.location.hash = '/rows/search/' + $.param(opts);
  }
});
我还尝试更改
主干网.history.navigate的
窗口.location.hash
,但错误仍然存在。实际上,
Backbone.history.navigate
是我的第一个镜头,所以我改为window.location.hash

我的集合是一个普通集合,只指定url参数,通过查询字符串进行搜索


伙计们,会是什么?为什么当我回顾历史时,它向我显示JSON而不是启动Backbone.js路由器?我怎样才能解决这个问题?是否可以在单个页面中使用Backbone.js而不是SPA?

根据您评论中的其他信息,看起来/rows/search/foo正在将服务器端路由到/rows?q=foo。尝试关闭pushState

使用

Backbone.history.start()

而不是

Backbone.history.start({pushState:true})


如果行为现在已经修复,那么这就是服务器端路由问题。如果仍要使用pushState,则需要确保以“/rows”(例如/rows/search/foo)开头的任何URL返回与“/rows”相同的HTML。这当然意味着您需要为ajax请求使用不同的URL模式(例如/api/rows?q=foo而不是/rows?q=foo)。

假设您经历了这些状态:/rows-->/rows/search/foo-->/login。现在,当您单击后退按钮时,您的URL是什么?我看到屏幕上打印了一个JSON,它是由
/rows?q=foo
rows.fetch()触发的ajax请求返回的。fetch()
只是为了回答您的问题:我的URL是
rows/search/foo
。但是,在这些状态下:/rows-->/rows/search/foo-->/rows/search/bar,然后单击“上一步”按钮即可正常工作。问题是加载一个no-backboned.js-page,因为我可以看到该行为尚未修复。还有别的事情发生了。谢谢你的解释!我修复了它,我想这是一个url路由问题。似乎如果ajax和pushState url是相同的,就会出现这个问题。谢谢谢谢你,约翰尼,你救了我一天!