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 相关文章推荐
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
javascript作用域和闭包使用详解
Apr 25 Javascript
使用Node.js配合Nginx实现高负载网络
Jun 28 Javascript
JavaScript中字面量与函数的基本使用知识
Oct 20 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
jquery easyui如何实现格式化列
Jul 30 jQuery
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
uni-app如何页面传参数的几种方法总结
Apr 28 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
php获取post中的json数据的实现方法
2011/06/08 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
Seajs的学习笔记
2014/03/04 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
python购物车程序简单代码
2018/04/18 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
简述python Scrapy框架
2020/08/17 Python
利用python绘制正态分布曲线
2021/01/04 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
GWT的应用有哪两种部署模式
2012/12/21 面试题
中文专业毕业生自荐信
2013/10/28 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
产假请假条
2014/04/10 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
建筑节能汇报材料
2014/08/22 职场文书
电力培训心得体会
2014/09/02 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android