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 21 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
JavaScript获取各大浏览器信息图示
Nov 20 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
Sep 08 Javascript
vuex 的简单使用
Mar 22 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
May 14 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
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数组去重的函数代码
2013/02/03 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
Python基本语法经典教程
2016/03/11 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
详解Python 函数参数的拆解
2020/09/02 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
研究生简历自我评
2015/03/11 职场文书
教师节晚会主持词
2015/06/30 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
2016年安全月活动总结
2016/04/06 职场文书