单页面

SPA(Single Page Application)指的是通单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把Web应用包一个壳,这个壳本质上是浏览器)变成一个“原生”应用。

在PC端也有广泛的应用,通常情况下使用Ajax异步请求数据,然后实现内容局部刷新,局部刷新的本质是动态生成DOM,新生成的DOM元素并没有真实存在于文档中,所以当再次刷新页面时新添加的DOM元素会“丢失”,通过单页面应可以很好的解决这个问题。

路由

在后端开发中通过URL地址可以实现页面(视图)的切换,但是AngularJS是一个纯前端MVC框架,在开发单页面应用时,所有功能都在同一页面完成,所以无需切换URL地址(即不允许产生跳转),但Web应用中又经常通过链接(a标签)来更新页面(视图),当点击链接时还要阻止其向服务器发起请求,通过锚点(页内跳转)可以实现这一点。

实现单页面应用需要具备:

a、只有一页面

b、链接使用锚点

基本原理

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>* {padding: 0;margin: 0;}.clearfix:after {content: '';display: block;visibility: hidden;clear: both;}.wrap {width: 600px;margin: 30px auto;}ul {list-style: none;border: 1px solid black;border-bottom: none;}li {width: 199px;height: 30px;line-height: 30px;float: left;/*margin-left: -2px;*/text-align: center;position: relative;}li a {text-decoration: none;color: black;}li:after {content: '';display: block;position: absolute;width: 1px;height: 16px;border-right: 1px solid black;top: 7px;right: 0px;}li:last-child:after {border: none;}.wrap .main {height: 400px;border: 1px solid #000;text-align: center;line-height: 400px;}</style>
</head>
<body>
<div class="wrap"><ul class="clearfix"><li><a href="#index1">index1</a></li><li><a href="#index2">index2</a></li><li><a href="#index3">index3</a></li></ul><div class="main"></div>
</div>
<script>//js有一个监听锚点变化的事件 hashchange
    window.addEventListener('hashchange', function (ev) {var hash = location.hash;hash = hash.slice(1);console.log(hash);var xhr = new XMLHttpRequest();xhr.open('get', '01.php?hash=' + hash);xhr.send(null);xhr.onreadystatechange = function (ev2) {if (xhr.readyState == 4 && xhr.status == 200) {document.querySelector('.main').innerHTML = xhr.responseText;}}})
</script>
</body>
</html>

通过上面的例子发现在单一页面中可以能过hashchange事件监听到锚点的变化,进而可以实现为不同的锚点准不同的视图,单页面应用就是基于这一原理实现的。AngularJS对这一实现原理进行了封装,将锚点的变化封装成路由(Route),这是与后端路由的根本区别。

具体使用

在angular的路由模块中,也实现了此功能,其原理如上。route模块之前是包括在angular核心代码中,后来分离出来,需要单独去引用才能使用

1、引入angular-route.js

2、实例化模块(App)时,当成依赖传进去(模块名称叫ngRoute)

3、配置路由模块

4、布局模板,通过ng-view指令布局模板,路由匹配的视图会被加载渲染到些区域。

路由参数:

when只需要两个参数,otherwise需要一个参数

1、when的第1个参数是一个字符串,代表当前URL中的hash值。

2、when的第2个参数是一个对象,配置当前路由的参数,如视图、控制器等。

a、template 字符串形式的视图模板

b、templateUrl 引入外部视图模板

c、controller 视图模板所属的控制器

d、redirectTo跳转到其它路由

<!DOCTYPE html>
<html lang="en" ng-app="App">
<head><meta charset="UTF-8"><title>Title</title><style>* {padding: 0;margin: 0;}.clearfix:after {content: '';display: block;visibility: hidden;clear: both;}.wrap {width: 600px;margin: 30px auto;}ul {list-style: none;border: 1px solid black;border-bottom: none;}li {width: 199px;height: 30px;line-height: 30px;float: left;/*margin-left: -2px;*/text-align: center;position: relative;}li a {text-decoration: none;color: black;}li:after {content: '';display: block;position: absolute;width: 1px;height: 16px;border-right: 1px solid black;top: 7px;right: 0px;}li:last-child:after {border: none;}.wrap .main {height: 400px;border: 1px solid #000;text-align: center;line-height: 400px;}</style>
</head>
<body>
<div class="wrap"><ul class="clearfix"><li><a href="#/index1">index1</a></li><li><a href="#/index2">index2</a></li><li><a href="#/index3">index3</a></li></ul><div class="main"><div ng-view=""></div></div>
</div>
<script src="../libs/angular.min.js"></script>
<script src="../libs/angular-route.js"></script>
<script>//之前路由模块也是处于核心模块之中,后来独立出去了//对路由模块的使用主要是进行config配置,配置完成之后即可使用var App = angular.module('App', ['ngRoute']);App.config(['$routeProvider', function ($routeProvider) {$routeProvider.when('/index1', {template: '<h1>index1</h1>'}).when('/index2', {template: '<h1>index2</h1>'}).when('/index3', {template: '<h1>index3</h1>'}).otherwise({redirectTo: '/index1'})}]);
</script>
</body>
</html>

转载于:https://www.cnblogs.com/wuqiuxue/p/8432088.html

Angular——单页面与路由的使用相关推荐

  1. nignx部署Vue单页面刷新路由404问题解决

    nignx部署Vue单页面刷新路由404问题解决 参考文章: (1)nignx部署Vue单页面刷新路由404问题解决 (2)https://www.cnblogs.com/wuchenggong/p/ ...

  2. vue 扫码页面限制区域_Vue.js 单页面多路由区域操作的实例详解

    单页面多路由区域操作 在一个页面中有两个及以上的区域,需要通过设置路由的index.js,来操作这些区域的内容 app.vue 中设置: index.js中设置: import vue from 'v ...

  3. Vue入坑——vue-router单页面多路由配置

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇:vue-router如何传递参数 一起学vue--vue学习总路线 ----------^~^我是萌萌哒分割线^~^- ...

  4. VUE 返回上一页 不刷新页面、重复进入同一页面created重复执行、每次进入页面时都执行created、vue单页面多路由,前进刷新,返回不刷新

    每次进入页面时都执行created.前进刷新,返回不刷新 思路: 利用 keep-alive与vue-router配合使用 ,判断哪些页面需要每次进入刷新,哪些页面不需要每次进入刷新: keepAli ...

  5. 容器化单页面应用中RESTful API的访问

    最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...

  6. (面试)单页面和多页面区别?

    目录 定义 单页面 多页面 区别 刷新的方式 路由模式 结构 维护成本 加载资源文件 开发的成本 用户体验 转场动画 数据传递 搜索引擎优化(SEO) 使用范围 定义 单页面 只有一个对应的html页 ...

  7. 访问页面升级访问_容器化单页面应用中RESTful API的访问

    最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...

  8. angular(3)服务 --注入---自定义模块--单页面应用

    ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...

  9. 【前端路由原理--原生JS实现方式】--前后端路由的区别、关于单页面应用与多页面应用、什么是CSR、SSR、SSG、ISP

    前言 本来只是想学习 React-Router v6 ,没有想到,带出了这么多东西.前后端路由有什么区别?SPA与MPA的是什么?在了解到前端路之后又发现单页面于应用与多页面应用的不同之处,以及 .n ...

最新文章

  1. 现在学java还是python好_该学Java还是Python?
  2. SAP WM Storage Type下不允许负库存的设置
  3. linux c openssl rsa 加解密
  4. 东北育才 数论专场第2场
  5. Android 三方库lottie、mmkv的使用
  6. open_links_per_instance 和 open_links 参数说明
  7. 进入postgresql
  8. VS 2010 和 .NET 4.0 系列之《WPF 4》篇
  9. mac下shell给文件名批量加前缀
  10. bytevalue_Java Number byteValue()方法与示例
  11. [c++]访MSN浮出窗口的示例
  12. 显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理
  13. 车辆抵押贷款风险分析
  14. c lambda表达式 select 改变字段名称_C博客作业01--分支、顺序结构 - 吖黑大帅
  15. 怎样使用OUTLOOK收发邮件   小雨
  16. python界面-图形界面
  17. sys.path.append 和 sys.path.insert辨析
  18. 微信iOS收款到账语音提醒开发总结
  19. 2017年总结--心情篇
  20. gtx1660是什么级别的_GTX1660显卡性能怎么样 gtx1660相当于什么显卡

热门文章

  1. nginx rewrite
  2. 【若依(ruoyi)】datetimepicker日期和时间插件
  3. 【SSL】java keytool工具操作java带的(JKS)证书库
  4. Linux 利用yum源安装nginx
  5. java getclass 相等_Java判断2个List集合是否相等(不考虑元素的顺序)
  6. processing图片粒子化_个人见到的processing(优质且全的教程,一定看原文)
  7. 苹果平板可以用html么,9.7寸ipad pro能用pencil吗?ipad pro全面支持Apple Pencil
  8. python定义x_Python 定义函数(示例代码)
  9. java调接口传值_关于调用第三方接口时传递参数是File类型的解决方式
  10. 推荐10个Github热门Python库,非常实用!