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 相关文章推荐
Extjs学习笔记之四 工具栏和菜单
Jan 07 Javascript
javascript 函数声明与函数表达式的区别介绍
Oct 05 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
javascript操作ul中li的方法
May 14 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
浅谈React中的元素、组件、实例和节点
Feb 27 Javascript
vue+element的表格实现批量删除功能示例代码
Aug 17 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
vue使用keep-alive保持滚动条位置的实现方法
Apr 09 Javascript
聊聊鉴权那些事(推荐)
Aug 22 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP 解决session死锁的方法
2013/06/20 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
JS 类型转换常见方法小结
2010/05/31 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python中表示字符串的三种方法
2017/09/06 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
详解python中的数据类型和控制流
2019/08/08 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
市场策划求职信
2014/08/07 职场文书
会员活动策划方案
2014/08/19 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
2022年显卡天梯图(6月更新)
2022/06/17 数码科技