1.引入 1.5版本的angularjs,直接打印angular对象:
<!---->
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body> <script type="text/javascript" src="../../js/angular-1.5.5/angular.js"></script>
<script type="text/javascript">
console.log(angular);
</script>
</body>
</html>
打印结果说明,当引入angularjs后,框架自动生成了一个angular对象,把angular对象作为一个属性暴露给window。这里重点关注 angular.module这个函数。
angular.module
可在全局位置创建、注册、获取Angular模块。所有模块(angular核心或第三方)都必须使用这个机制注册才能在应用中生效。
当传递两个或多个参数时,会创建一个新模块。如果只传递一个参数,则是获取一个存在的模块(第一个参数指向一个已经创建好的module
)。
模块
一个模块是服务、指令、控制器、过滤器和配置信息的集合。 angular.module
用于配置$injector。
// Create a new module
var myModule = angular.module('myModule', []); // 第一个参数是模块名,后面中括号里面是所依赖的其他模块的模块名,如果没有,写空数组。
<!---->
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body ng-app="myApp"> <script type="text/javascript" src="../../js/angular-1.5.5/angular.js"></script>
<script type="text/javascript">
console.log(angular);
var myModule = angular.module('myApp',[]);
</script>
</body>
</html>
上面定义了一个angular模块对象,并使用ng-app指令让这个模块接管body这块区域,运行并打开插件,如下:
而之前没有定义模块时,是这样:
也就是,body中ng-app指向模块对象的名字。而angular模块对象其中有一个方法:controller(名称, constructor);
用来产生一个作用域对象。示例如下:
<!---->
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="../../js/angular-1.5.5/angular.js"></script>
<script type="text/javascript">
console.log(angular);
var myModule = angular.module('myApp', []);
11 myModule.controller('myController', function ($scope) {
12 $scope.empName = 'kobe';
13 });
14 myModule.controller('myController2', function ($scope) {
15 $scope.empName = 'wade';
16 });
</script>
</head>
<body ng-app="myApp">
<!-- 让自定义的控制器指向这个div -->
<div ng-controller="myController">
<input type="text" ng-model="empName">
<p>员工名字:{{empName}}</p>
</div>
<div ng-controller="myController2">
<input type="text" ng-model="empName">
<p>员工名字1:{{empName}}</p>
</div>
</body>
</html>
打开ng-inspector插件,对2个input标签分别输入不同的内容,可以看到,两个输入框及下面的显示区显示的内容各不影响,跟代码里面一个div指向一个controller 相符合。
但是,上面代码里面创建作用域对象代码重复,而且angularjs 同样支持链式调用,创建模块及作用域对象的代码优化如下:
angular.module('myApp', []).controller('myController', function ($scope) { //隐式声明依赖注入
$scope.empName = 'kobe';
}).controller('myController2', function ($scope) {
$scope.empName = 'wade';
});
上面 angular.module('myApp', []).controller('myController', function ($scope) { $scope.empName = 'kobe'; })
angular对象调用它自己的module方法,返回值是一个 模块对象,这个模块对象调用controller方法,返回值仍是一个模块对象,这是链式调用的基础。
这样改完了,但是代码仍旧存在问题:代码上线时,会对js文件进行压缩,压缩js代码时,$scope会被简单字母代替,angular无法解析,解决方式如下:
在controller()方法中,第一个参数是 作用域对象的名字,第二个参数改为数组,数组的第一个参数固定写 '$scope',第二个参数写构造函数,如下:
angular.module('myApp',[]).controller('myController',['$scope',function (a) {
2 a.empName = 'kobe';
3 }]).controller('myController2',['$scope',function (a) {
4 a.empName = 'wade';
5 }]);
当angular解析时,会用数组的第一个元素$scope去替换后面function中的形参,这种方式叫做显式声明依赖注入