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 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
JS常见问题整理(持续更新)
Aug 06 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
Nov 01 Javascript
ES6正则表达式扩展笔记
Jul 25 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
Mar 27 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 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
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php表单敏感字符过滤类
2014/12/08 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python imread、newaxis用法详解
2019/11/04 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Python matplotlib可视化实例解析
2020/06/01 Python
python能否java成为主流语言吗
2020/06/22 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
校班主任推荐信范文
2013/12/03 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
养牛场项目建议书
2014/05/13 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
小学优秀学生评语
2014/12/29 职场文书
奖学金个人总结
2015/03/04 职场文书
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL