backbone之路由锚点的替换
1、需求
由于项目一开始做的时候不甚完善,所有的网页没有路由功能,导致一些搜索结果在页面跳转之后,没有被记录下来,在页面跳转之后回退,得到的是页面最原始的结果,没有指定的搜索条件。最近项目的在完善这些小的细节,所以在此记录一下。
2、操作
由于项目的所有传参都是使用 '?' 来标识的,而Backbone的路由是使用锚点 '#' 来的,为了兼容以前的做法,不得不去修改Backbone的源码,还好路由部分的源码不多
2.1 修改Backbone的源码,版本1.3.3
1)修改标识 '#' -> '?'
把源代码中的字符串中的'#'修改为'?',把单个的'#'修改为'?'
例:
var pathStripper = /#.*$/;
修改为:
var pathStripper = /\?.*$/;
例:
this.location.replace(rootPath + '#' + this.getPath());
修改为:
this.location.replace(rootPath + '?' + this.getPath());
注:字符串中的?需要\来转义,字符不需要
2)修改锚点的路由设置
_updateHash: function(location, fragment, replace) {
if (replace) {
var href = location.href.replace(/(javascript:|\?).*$/, '');
location.replace(href + '?' + fragment);
} else {
// Some browsers require that `hash` contains a leading #.
// location.hash = '?' + fragment;
var href = location.href.replace(/(javascript:|\?).*$/, '');
// window.history.pushState({}, 0, href + '?' + fragment);
window.history.replaceState({}, 0, href + '?' + fragment);
}
}
注:
location.hash是原始的修改参数方法,会替换url中'#'以及后的所有内容
window.history.pushState可选目标方法,会增加一次历史记录,刷新页面
window.history.replaceState可选目标方法,会替换掉当前的页面记录,不刷新页面(目前选用方案)
2.2 写一个Util
写一个工具类用于Router的快速使用,和统一修改
/**
* RouterUtil.js
*/
var RouterUtil = (function() {
// Backbone Router with a custom parameter extractor
var Router = Backbone.Router.extend({
params : "",
routes : {
"*actions": "defaultRoute" // 匹配 http://example.com/#anything-here
},
defaultRoute : function(params) {
Router.params = params;
},
});
var routerUtil = {
web_router : null,
init(){
// 初始化
if(!routerUtil.web_router){
routerUtil.web_router = new Router;
Backbone.history.start();
}
},
getParam(cbFn){
routerUtil.init();
// 获取#之后的参数
if(cbFn){
cbFn(Router.params);
}
},
route(returnUrl, cbFn){
// 动态的调整 路由规则 例:topic/:pageno/:pagesize
routerUtil.web_router.route(returnUrl,"page", cbFn)
},
start(){
// 启用路由
if(!Backbone.History.started){
Backbone.history.start();
}
},
stop(){
// 关闭路由
if(Backbone.History.started){
Backbone.history.stop();
}
},
navigate(returnUrl){
/**
* 重构 ,路由导向
*/
//此处根据自己的需求去构建参数拼接
//returnUrl为'?'之后的内容
if(returnUrl){
}else{
returnUrl = "searchType=" + SearchBoxUtil.searchType + "&" + SearchBoxUtil.formData;
}
routerUtil.web_router.navigate(returnUrl, {
trigger: true
});
}
}
return routerUtil;
})();
2.3 使用
在js中引用的一些方法
// 页面的初始化
initPagi : function(){
RouterUtil.getParam(function(params){
if(!params){
params = "";
}
//处理参数
...
});
},
//查询函数
queryData : function(returnUrl,isInitSearchBox){
if(!returnUrl){
returnUrl = "";
}
if(isInitSearchBox){
//第一次初始化查询
}else{
//非第一次初始化查询
RouterUtil.navigate(returnUrl);
}
...
},
菜鸟一枚,随便弄弄的一点代码,有更好的方案请赐教
backbone之路由锚点的替换的更多相关文章
- Router和History (路由控制)-backbone
Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...
- 全面解析JavaScript的Backbone.js框架中的Router路由
这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...
- BackBone结合ASP.NET MVC实现页面路由操作
1. 问题的背景 什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性.应用场景主要有页面操作过程中的添加收藏夹的操作.后退操作等过程中能完全恢复界面. ...
- backbone.Router History源码笔记
Backbone.History和Backbone.Router history和router都是控制路由的,做一个单页应用,要控制前进后退,就可以用到他们了. History类用于监听URL的变化, ...
- Backbone源码阅读手记
Backbone.js是前端的MVC框架,它通过提供模型Models.集合Collection.视图Veiew赋予了Web应用程序分层结构.从源码中可以知道,Backbone主要分了以下几个模块: ( ...
- Backbone框架浅析
Backbone是前端mvc开发模式的框架.它能够让view和model相分离,让代码结构更清晰简答,开发进度加快,维护代码方便.但是,现在出了一种mvvm框架,它是下一代前端mvc开发模式的框架,代 ...
- backbone库学习-Router
backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来自http://blog.csdn.n ...
- Backbone笔记(续)
Backbone Bockbone 总览 Backbone 与 MVC 模式:解决某一类问题的通用方案 - 套路 MVC:一种架构模式,解耦代码,分离关注点 M(Model) - 数据模型 V(Vie ...
- Backbone源码分析-Backbone架构+流程图
作者:nuysoft/高云/nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. Backbone0.9.1源码分析分析系列 jQuery1.6.1源码分析系 ...
随机推荐
- UWP-消息提示(仿Android)
原文:UWP-消息提示(仿Android) 在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那 ...
- 中国2017 Google 开发者大会第一天简单回顾
昨天有幸参加了中国2017 Google 开发者大会,在这第一天就收获满满,昨天太忙了,今天早晨来一起简单回顾一下,可以让没有参加的童鞋们感受一下现场的温度. 早早就来到了会议现场,外面看不出什么特别 ...
- Attention is all you need及其在TTS中的应用Close to Human Quality TTS with Transformer和BERT
论文地址:Attention is you need 序列编码 深度学习做NLP的方法,基本都是先将句子分词,然后每个词转化为对应的的词向量序列,每个句子都对应的是一个矩阵\(X=(x_1,x_2,. ...
- Cocos2d-x 3.X Qt MinGW版本编译运行
自Cocos2d-x 3.X引入了C++ 11特性,在Windows平台上的支持就仅限VS 2012,其实还可以尝试MinGW版本,GitHub上有MinGW版本的Qt Creator工程. 地址:h ...
- 运维不仅仅是Linux,居然还要知道这么多?
摘要: 运维不仅仅是懂Linux就行,因为还有一大部分的Windows运维,向windows运维人员致敬.当然我们这篇文章不是说运维除了懂Linux,还要懂Windows,而是涉及运维的其他方方面面. ...
- better later than never
工作一年半,写程序也有几年了,终于开了个博客,记录一下遇到的问题和解决方法,和其他需要记录的东西.希望自己不会懒……已经开通两周了才开始写,唉……
- 全量导入数据 导致solr内存溢出 崩溃问题解决
在 data-config.xml 文件中 增加一个参数即可: batchSize="-1"
- PHP/JS中获取当前页面的完整URL
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 php实现 PHP实现 #测试网址: http://localhos ...
- python中的基本数据类型之列表,元组
一.列表 1.什么是列表. 列表是python的基本数据类型之一,用[]来表示,可以存放各种数据类型(什么都能装,能装对象的对象) 列表相比于字符串,不仅可以存放不同类型的数据,而且可以存放大量的数据 ...
- SYN6107型 GPS北斗双模子钟
SYN6107型 GPS北斗双模子钟 产品概述 SYN6107型GPS北斗双模子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套以接收北斗卫星信号的子钟,从北斗地球同步卫星上获取标准时钟信号 ...