Angular的模块化开发

目录结构


在这里插入图片描述


在这里插入图片描述


  • 说明:模块化开发会用外链模板,需要跑在服务器环境
  • 上述结构WWW文件夹是项目根目录,子文件夹router-template里是各个抽离出去的模版
  • 和router-template同级的index.html是入口文件,它和模板里的index.html 不是一回事

模板内容

  • root.html
<header>
	<h1>header</h1>
</header>

<ui-view></ui-view>

<footer>
	<h1>footer</h1>
</footer>
  • 这是最基础的模板,所有模板都作为这个家伙的子模版进行填充,ui-view可以理解为填充的位置
  • 如果你把ui-view放在最后,就是这样
    在这里插入图片描述

  • app.html
<section class="content">
	<div class="left">
		<ul>
			<li><a ui-sref="root.app.index" ui-sref-active="active">home</a></li>
			<li><a ui-sref="root.app.news"  ui-sref-active="active">news</a></li>
			<li><a ui-sref="root.app.music" ui-sref-active="active" >music</a></li>
			<li><a ui-sref="root.app.about" ui-sref-active="active" >about</a></li>
		</ul>
	</div>

	<div class="right">
		<ui-view></ui-view>
	</div>
</section>
  • app模板就是填充的父模板root,注意这里ui-sref="root.app.index",打点写了,表示填充层级
  • 可以看到,在最下边还有一个ui-view,也就意味着将来还有子模板填充父模板app
  • 那么问题来了,下一个子模板是谁??再想想这句ui-sref="root.app.index"
  • a链接切换到谁,就是由谁来填充,这里可能的子模板是index,news,music,about

  • index.html<h1>我是首页{{indexCtrl.word}}</h1>
  • music.html<h1>我是音乐{{musicCtrl.word}}</h1>
  • news.html<h1>我是新闻{{newsCtrl.word}}</h1>
  • about.html<h1>关于我们{{aboutCtrl.word}}</h1>

入口文件index.html

<!DOCTYPE html>
<html lang="en" ng-app="myapp">
<head>
	<meta charset="UTF-8">
	<title>路由演示--模快化</title>
	<style>
		*{
			margin: 0;
			padding:0;
		}
		header,footer{
			width:100%;
			height:60px;
			background-color: #333;
			text-align: center;
			color:white;
			font-size:18px;
			line-height: 60px;
		}

		.content{
			width:1200px;
			overflow: hidden;
			margin: 0 auto;
		}

		.left{
			float: left;
			width:300px;
			height:300px;
			margin-top:100px;

		}
		.left ul{
			list-style:none;
		}
		.left ul li{
			margin:10px 0;
		}
		.left ul li a{
			text-decoration: none;
		}


		.right{
			margin:100px auto;
			width:300px; 
		}
		.active{color:red;}
</style>
</head>
<body>
	<ui-view></ui-view>
	 
	<script  src="https://cdn.bootcss.com/angular.js/1.7.8/angular.min.js"></script>
	<script  src="https://cdn.bootcss.com/angular-ui-router/1.0.22/angular-ui-router.min.js"></script>

	<script type="text/javascript">
		var myapp = angular.module("myapp",["ui.router"]);

		//配置路由表,实际上在配置$state服务。
		myapp.config(function($stateProvider,$urlRouterProvider) {
			$stateProvider
			.state({
				name: 'root',
				templateUrl: 'router-template/root.html'
			})
			.state({
				name:"root.app",
				url : "/app",
				//引入外链模板
				templateUrl: 'router-template/app.html'
			})
			.state({
				name:"root.app.index",
				url : "/index",
				templateUrl: 'router-template/index.html',
				//实例化控制器
				controller : "IndexCtrl as indexCtrl"
			})
			.state({
				name:"root.app.news",
				url : "/news",
				templateUrl: 'router-template/news.html',
				controller : "NewsCtrl as newsCtrl"
			})
			.state({
				name:"root.app.music",
				url : "/music",
				templateUrl: 'router-template/music.html',
				controller : "MusicCtrl as musicCtrl"
			})
			.state({
				name:"root.app.about",
				url : "/about",
				templateUrl: 'router-template/about.html',
				controller : "AboutCtrl as aboutCtrl"
			});

			//对路由表中不存在的路径统一处理,全部跳转到首页#!/
			$urlRouterProvider.otherwise('/app/index');
		});


		myapp.controller("IndexCtrl",[function(){
			this.word = "--home";
		}]);

			myapp.controller("MusicCtrl",[function(){
			this.word = "--music";
		}]);

			myapp.controller("NewsCtrl",[function(){
			this.word = "--news";
		}]);

			myapp.controller("AboutCtrl",[function(){
			this.word = "--about";
		}]);
	</script>
</body>
</html>
  • 对入口文件的一些解释

可以看到入口文件body主体就是一个ui-view,如果你把css和js再抽离出去,页面会更加干净。那你有没有想过,页面到底是怎样渲染出来的?
关键在路由上。
仔细看看访问路径,都是#!/app/xx。以渲染首页为例,访问路径是#!/app/index。这个时候就去检索路由表,看看匹配到了哪个。我的理解是,在匹配访问路径/index的时候,上边的两个父级路由也都匹配了,先root,然后加载app,app再加载填充进来的index.html模板,最终将视图完整呈递。当然,这一切的开始不是root,而是入口文件里唯一的ui-view,这个东西的存在,潜意识告诉你,有东西需要填充进来。


效果图

在这里插入图片描述


在这里插入图片描述

示意图

在这里插入图片描述

在线测试

https://lengyuexin.github.io/module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值