JS中如何实现Laravel的route函数详解


Posted in Javascript onFebruary 12, 2017

大家应该都知道在Laravel的路由模块里,我们可以给每一个路由设定一个名字,比如:

Route::get('/blog/{blog}', 'BlogController@show')->name('blog.show')

然后就可以通过

route('blog.show', ['blog' => 1])

来获取到这个路由的访问地址,后端跳转可以用

return redirect()->route('blog.show', ['blog' => 1]);

这样做的好处是如果发生url变更,比如我想把 '/blog/{blog}'改成 '/boke/{blog}' ,只需要改路由文件,别的地方都不用调整。

但这个仅限于后端,以及blade模板可以使用,稍微上点规模的网站都会把js文件单独拎出来,不会直接写在blade模板中,这样就导致js里发ajax请求时或者页面跳转时只能将请求地址写死,比如

location.href = '/blog/' + id;

这样万一路由发生变更,还得去修改js文件,如果同一个路由被多个js调用,漏改一两个还是很容易发生的。所以我就考虑能不能在js中实现一个类似后端的route函数。

最终的解决方案很简单,两个函数就搞定。

后端部分需要实现一个函数

function route_uri($name)
{
 return app('router')->getRoutes()->getByName($name)->getUri();
}

这个函数的作用是根据路由名称返回原始的路由地址,比如:

echo route_uri('blog.show'); // 会输出/blog/{blog}

前端也只需要一个函数:

let route = (routeUrl, param) => {
 let append = [];
 for (let x in param) {
  let search = '{' + x + '}';
  if (routeUrl.indexOf(search) >= 0) {
   routeUrl = routeUrl.replace('{' + x + '}', param[x]);
  } else {
   append.push(x + '=' + param[x]);
  }
 }
 let url = '/' + _.trimStart(routeUrl, '/');
 if (append.length == 0) {
  return url;
 }
 if (url.indexOf('?') >= 0) {
  url += '&';
 } else {
  url += '?';
 }
 url += append.join('&');
 return url;
}

注:这里引用了lodash

这个函数的作用是:

route('/blog/{blog}', {blog: 1}); //返回 /blog/1
route('/blog/{blog}', {blog: 1, preview: 1}); //返回 /blog/1?preview=1

然后就很简单了,在blade模板中定义:

var routes = {
 blog: {
  show: '{{ route_uri('blog.show') }}',
  update: '{{ route_uri('blog.update') }}',
  destroy: '{{ route_uri('blog.destroy') }}'
 }
};

在js文件里就可以:

$.post(route(routes.blog.update, {blog: 1}), {title: 'xxx', content: 'xxx'})

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
用javascript获得地址栏参数的两种方法
Nov 08 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
Node.js制作简单聊天室
Jan 12 Javascript
Bootstrap如何激活导航状态
Mar 22 Javascript
jQuery实现鼠标经过显示动画边框特效
Mar 24 jQuery
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
Jun 17 Javascript
JavaScript中filter的用法实例分析
Feb 27 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 Javascript
JS删除对象中某一属性案例详解
Sep 08 Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 #Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 #Javascript
老生常谈jquery id选择器和class选择器的区别
Feb 12 #Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 #Javascript
浅谈jQuery中事情的动态绑定
Feb 12 #Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
Feb 12 #Javascript
jq stop()和:is(:animated)的用法及区别(详解)
Feb 12 #Javascript
You might like
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
Smarty模板语法详解
2019/07/20 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python正规则表达式学习指南
2016/08/02 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
自荐信的基本格式
2014/02/22 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
董事长助理工作职责
2014/06/08 职场文书
停水通知
2015/04/16 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android