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 相关文章推荐
用jquery存取照片的具体实现方法
Jun 30 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
JS的get和set使用示例
Feb 20 Javascript
javascript解析xml实现省市县三级联动的方法
Jul 25 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 Javascript
BootStrap table使用方法分析
Nov 08 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 Javascript
详解vue在项目中使用百度地图
Mar 26 Javascript
JS实现滑动导航效果
Jan 14 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python版微信红包分配算法
2015/05/04 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
基于matplotlib xticks用法详解
2020/04/16 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
python中取绝对值简单方法总结
2020/07/24 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
爱护草坪标语
2014/06/24 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
小浪底导游词
2015/02/12 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python