ajax实现局部删除,Express+AdminLTE+hbs+Ajax实现局部刷新终极版(第二部分)

上一篇中已经把所有思路都理顺了,这边我们就开始具体编码吧。(如果您有更好的办法,欢迎留言讨论!互相学习!)

我们先来看一下最终完成的效果:

a7bd314eded5aef8d8dfddd386d31aef.png

一:完整项目目录结构如图所示:

6b7c7af164ac17db9b513ac6f22bf911.png

二:更换模板引擎为  hbs

2.1  安装 express-hbs

npm i express-hbs

2.2 在app.js中更换模板引擎,并指定母版页位置  如图:

a52f72314cd40606905bb31177e46a23.png

至此,我们的模板引擎更换完毕,你会发现,在Views文件加下的所有文件,都是以*.hbs结尾的,如果新加文件,请保持后缀一致。

2.3 刚才已经配置好了母版页的位置,就是  “/views/layout”  ,现在我们去看看这个母版页里面的内容吧;如下图

33ba9c0bd4dd2033e581ad6380e639ff.png

2.4 现在来介绍下母版页,这个母版页是AdminLTE中的精简版,我把多余的部分全部删除。

从图中可以看出,模板分为四个部分:header(头部)、 aside(侧边栏)、 content(中间内容)  和  footer(底部)

其中我们注意到,在中间内容部分,有一个  {{{body}}}这种写法的意思就是:每次访问具体页面时,会将具体页面替换掉{{{body}}}部分的内容;

例如:我们想访问主页,主页是  views/index.hbs,我们来看看其中的内容:

19c10dd172bde742df5f3e8d3e9444b5.png

是的,主页里就只有这些代码,当进行访问主页路由的时候,也就是  localhost:3000时,hbs会将整个div自动替换{{{body}}}

我们所看到的就会如下:这极大的方便了我们对模板的应用。

847dd19568930d03d7ee0b53b860cdc0.png

到目前,我们所有的视图都具备模板了,而且母版页是单独存放的;下面我们来解决无刷新问题;

三:使用ajax实现无刷新页面

首先,我们编写一个公共的js方法,放在  Base.js中,这个方法有两个作用

1:将侧边栏所有的页面切换请求,通过Ajax发送出去,并得到一个html 页面,将中间部分进行填充;

2:成功填充页面后,将当期请求的url更新到地址栏,以便于用户刷新操作;

看一下这个方法:

var ChangePage = function (url) {

$.ajax({

type: 'GET',

url: url,

data: { c_type: 'page' },

success: function (res) {

$("#main_container").html(res);

var stateObject = {};

var title = "Wow Title";

var newUrl = url;

history.pushState(stateObject, title, newUrl);

}

});

}

细心的朋友会发现一个问题,我在ajax请求的时候,给了一个参数:c_type

别忘记了,这里还有一个非常严重的问题没有解决,那就是  通过页面侧边栏发起的页面跳转,我们希望返回的是不带模板页的分布视图!

这里的参数 c_type就是为了便于后续的区分处理

四:路由中渲染页面的区分处理

4.1 来看一下路由渲染页面是如何进行操作的(为了方便,我把所有页面的跳转都写到了index.js路由中,不要像我学习啊,我实在是太懒了)

router.get('/', function(req, res, next) {

var pageData = {};

if(req.query.c_type=='page')

{

pageData.layout='';

}

res.render('index', pageData);

});

首先我们定义了一个对象:pageData,他用来向页面传递数据;

这里当我们发现前端请求的参数里包含一个叫 c_type 的参数,并且值为  page 那么我们就认为他是从页面侧边栏发起的请求

这个时候,我们关键性的一句来了:pageData.layout='';这一句的意思就是不使用模板,返回局部视图,从而实现了无刷新;

4.2 但是这样的操作太过繁琐,我们岂不是每个路由都需要添加一个类似的判断?太麻烦了吧?于是我们想到了 中间件 ,它可以把每个请求都过滤一下;

我们来看一下中间件的写法:

//拦截器,必须放在静态资源声明之后、路由导航之前

app.use(function (req, res, next) {

var url = req.query.c_type;

global.pageData = {

data:{}

}

if (url == "page") {

global.pageData.layout='';

}

console.log(global.pageData)

next();

});

这里我们把每个请求都就进行拦截,如果发现请求中带有  c_type参数,那么我们就定义一个全局对象:global.pageData

并给  pageData.layout 赋值为空;

在每个路由中,我们只需要引用下这个全局变量,就可以实现模板的自由控制:改良后的路由如下:

router.get('/', function(req, res, next) {

res.render('index', global.pageData);

});

是不是瞬间少了好多代码!

如果你有一些自定义的数据,就可以放到global.pageData中,这里不作过多解释;

到目前,你已经完成了大部分的操作,页面实现了无刷新加载!

五:关于页面侧边栏配置,以及样式保留问题

侧边栏的样式完全是AdminLTE中的原始样式,这里你需要稍微观察一下,如果需要添加更多的侧边栏,只需要按照其规则就可以

关于样式保留,这里我们不过多的介绍,下面是完整方法:在  Base.js中

$(".treeview a").click(function () {

var item = $(this).parent().parent().parent('.treeview');

var idStr = $(item).attr('id');

if (idStr != undefined) {

localStorage.setItem("c_slider", idStr);

}else

{

localStorage.setItem("c_slider", '');

}

})

$(function () {

var c_slider = localStorage.c_slider

if (c_slider != undefined) {

$("#" + c_slider).addClass("menu-open");

$("#" + c_slider + ' ul').css('display', 'block');

}

})

六:完整Demo下载:

https://download.csdn.net/download/tomato2313/10937611(可能还在审核中)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打乱 数字_崔召幼儿园中班悦享时光——亲子益智游戏数字配对

亲爱的小朋友们,我们已经掌握了简单的,数字宝宝,今天让我们通过已有的数字经验和点数经验来玩一个数字配对的游戏吧!准备:1.准备骰子一个,吸管一支,数字1-6卡片。 2.一个鞋盒盖,一个…

云服务器BBC销售渠道,云服务器BBC控制台

云服务器BBC控制台 内容精选换一换云服务器备份提供了Web化的服务管理平台,即管理控制台和基于HTTPS请求的API(Application programming interface)管理方式。API方式如果用户需要将云服务平台上的服务器备份集成到第三方系统,用于二次开发,请…

python随机数据随概率分布_概率分布及其Python实现

一、学习概率分布有什么用?很多现实中的分布都来自几种概率分布。对个人生活和工作选择非常有帮助。 知道某件事发生的概率对我们作出数据分析决策很有帮助。有时候计算概率很简单,有时候计算概率很复杂,概率分布是帮助我们解决特定问题下的万能模版。 …

安全策略_Spring Security 实战干货:如何实现不同的接口不同的安全策略

1. 前言欢迎阅读 Spring Security 实战干货 系列文章 。最近有开发小伙伴提了一个有趣的问题。他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Token;另一种是管理后台使用的是Freemarker&#xff0c…

antd 怎么用ajax,react+dva+antd接口调用方式

一丶 安装通过 npm 安装 dva-cli 并确保版本是0.8.1或以上。$ npm install dva-cli -g$ dva -v0.8.1二丶创建新应用安装完dva-cli之后,就可以在命令行里访问到dva命令(不能访问?)。现在,你可以通过dva new创建新应用。$ dva new dva-quicksta…

python外星人入侵怎么发给别人_python_外星人入侵(1-1)

sys:system的简称。包含了一些与系统有关的函数。 step1:构建游戏的主框架 import sys import pygame def run_game(): 初始化游戏并创建一个屏幕对象 pygame.init() # 创建一个显示窗口,宽1200像素,高800像素 screen pygame.dis…

gta5怎么设置画质最好_GTA5画面如何设置最好_GTA5画质设置成最高配置推荐-win7之家...

GTA5是侠盗猎车手的简称,这款游戏是很多玩家都很热爱的一款网络游戏,在游戏过程中,我们可以通过画面设置来提高游戏的画面效果,不过还要顾及游戏的流畅性,那么GTA5画面如何设置最好呢?针对这个问题&#xf…

js ajax递归调用,js的promise如何递归调用?

好问题,正中Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容也就是说,如果要用promise来递归&…

python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例

smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置一下。outlook发送就是Python直接调用win32方式。调用程序outlook直接发送邮件。 import win32com.client as win32 import xlrd outlook win32.Dispatch(outlook.application) mail outlook.CreateItem(0)…

cpu java poi 导出_Java里当POI导出Excel数据比较大时的优化方案

问题在Java里绝大多数都是使用POI进行导入导出Excel,正常情况下也都没有问题。但当导出的数据量比较大时,我留意到我本机当数据量达到两三万条(二十个列)时,就会出现内存溢出,CPU飙升到95%以上的情况。可能换到好点的服务器上会好…

服务器在行例维护中,8月14日服务器例行维护公告

原标题:8月14日服务器例行维护公告亲爱的玩家:青龙乱舞区、大地飞鹰区、天命风流区、沧海云帆区全部服务器将在8月14日6:00~10:00停机维护更新,维护完成后上述各服务器客户端版本更新至2.0.94.6。本次维护主要调整和修改内容如下,…

dedecms联动筛选_DEDECMS分类信息按联动类别筛选的实现方法

注意:本教程只在DedeCMS V5.6上测试过,v5.7sp1的话一般也会通用,请自行测试!实现方法:1. 修改include\taglib\infolink.lib.php,找到:require_once(DEDEROOT./data/enums/infotype.php);在其下面…

暗黑2战网服务器爆率修改,暗黑2修改MOD最初级基础

第一步:得到修改所用的工具修改MOD首要的是工具,这里推荐几款常用工具:MPQ文件打开及导入工具:MPQWorkshop 备用:mpqview CV5.x (初级入门推荐mpqworkshop,必需)MPQWorkshop是目前最好的工具,主…

delphi listview 添加数据 慢_Delphi 二十四岁, Delphi 10.3.1 发布

Delphi1 是 Borland于1995年2月14日发布,因此2019年2月14日是该产品发布的24周年纪念日。如果你想了解一些关于该产品及其发布的历史,你可以参考文章“22 Years of Delphi and it Still Rocks”。在那篇文章中,我收集了一些早期产品的照片&am…

找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!

有一个万能公式,可以帮你解决任何烦恼。我是在十几年前学到的,一直使用到现在。不仅简单,而且非常有效,只有3步,马上就能现学现用。如果你目前正好碰到了什么难题,不妨试试这个万能公式。01第一步&#xff…

python 目录下的文件_用python把文件夹下的所有文件包括文件夹里面的文件都拷贝到同一个目录下...

比如1文件夹下有2文件夹,2文件夹下有1.txt文件和3文件夹,3文件夹下有2.txt3.txt现在要把1.txt2.txt3.txt全都拷贝到1文件夹下importosimportshutildefchange(path,path1):i1#printi... 比如1文件夹下有2文件夹,2文件夹下有1.txt文件和3文件夹…

vue 判断两对象是否一致_你的.vue文件就已经是你的文档了

更新:文档地址:http://vuese.org昨天发布了vuese1.0,这是我的一个新的开源项目,用来解析Vue SFC并生成markdown文档,如下:HcySunYang/vuese​github.com这篇文章不会介绍如何使用,至于如何使用大…

centos7 oracle_Centos7主机名变成bogon的原因及解决方法

问题描述虚拟机在设置完静态IP后,莫名其妙地主机名就变成了bogon,并且问题会稳定复现,就是说每次重启都会。如下图所示:看着不顺眼不说,听说可能还会影响某些服务,如可能导致oracle安装过程网络配置出错等问…

get 参数太长怎么办_新买的手表表带太长了该怎么办?表带调节操作方法get你~...

表表哥点击☝上方蓝字关注我们表带是手表的重要组成部分,同时表带决定着手表佩带的舒适性,方便性,对手表的安全也有关系。现在表带的材质也很多,最常见的就是不锈钢的和真皮的。买过手表的人应该都知道,只有是专门定制…

python pandas合并多个excel_python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)...

# python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件) import tkinter as tk from tkinter import filedialog import os import pandas as pd import glob root tk.Tk() root.withdraw() # 选择文件夹位置 filelocation os.path.n…