angular1自2009年出来之后一直很火,但也有不少弊端:比如十分影响性能的dirty check;所以google对angular2的设计可谓是完全颠覆,和vue.js,react.js类似,都跟上了组件化开发的新趋势,angular1确实是处于一种完全尴尬的境地; 这里就只当“温故”吧

directive

angular1被人吐槽的一点就是太多新的概念,学习曲线太陡。要说其中最常用也比较难以运用的就是directive了,directive实际上就是一种组件化的思想,一个指令封装dom操作和相应逻辑,达到封装一次,到处使用的目的
这个很实用,比如之前做的一个ionic的app。有多个列表页,当时为了赶时间就没有进行指令化,连续写了四个很类似的页面,修改起来也很麻烦。
以下贴一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
angular.module('docsTransclusionExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.name = 'Tobias';
$scope.list = [];
}])
.directive('myDialog', function() {
return {
restrict: 'E',
transclude: true,
scope: {
list: '=li'
id: '@',
onSend: '&'
},
templateUrl: 'my-dialog.html',
link: function (scope, element) {
scope.name = 'Jeff';
},
controller: 'SomeController',
controller: function($scope, $element, $attr $transclude){
}
};
});
//my-dialog.html
<div class="alert" ng-transclude>
</div>
//index.html
<div ng-controller="Controller">
<my-dialog li="list" on-send="sendMail()" from-name="">Check out the contents, {{name}}!</my-dialog>
</div>

其中scope就是指令内的作用域,一旦定义scope属性,就隔离了外部作用域。如果不定义这个,那么指令作用域就会自动继承父级作用域,这里就是controller的作用域scope
scope中可以用来接收外部传参,’=’是双向绑定,@是单向绑定,&是绑定方法

transclude的使用也是一个重点。比如上述代码,那么最终会被解析为‘Tobias’,因为transclude:true,和ng-transclude的配合使用使得指令作用域中包含的html拥有了指令外部的作用域(也就是controller作用域)而不是指令内部的作用域。
The transclude option changes the way scopes are nested. It makes it so that the contents of a transcluded directive have whatever scope is outside the directive, rather than whatever scope is on the inside.
这一点还是改变不了的。其实这是有必要的,因为内部元素要独立出来,证明是想获得外部作用域的,否则完全可以直接放在template模板中

controller属性可以是一个字符串或者一个函数,如果值为字符串,会以字符串的值为名字来查找注册在应用中的控制器的构造函数,
如果为匿名函数则与link函数类似,但link只能在当前指令中定义行为,无法在指令间复用,而controller却可以复用

config和run

1
2
3
4
5
6
7
angular.module('myApp', [])
.config(function($routeProvider){
})
.run(function(){
});

config方法是唯一能在应用启动之前修改的部分,config只支持部分的类型注入:provider和constant。这证明只有通过provider自定义的service和.constant声明的常量才能够被注入
run方法则是在注入器创建之后被执行。它是angularjs应用中第一个被运行的方法,运行块常用于注册全局的时间监听器

services

服务也是angular的重要组成部分,与controller每次被销毁和新建不同,service是单例的,且是懒加载。并且一旦被创建不会被销毁,知道应用结束。
除常用的factory创建服务之外,还有:
service()
constant()
value()
provider()
几种创建服务的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
angular.module('myApp')
.factory('indexService', function($http){
return {
getName: function(){
}
};
})
//service可以注册一个支持构造函数的服务
.service('serviceService', function($http){
this.getName = function(){
}
})
//provider注册服务必须提供一个$get方法
.provider('providerService', {
$get: function(){
return {
'username': 'auser'
};
}
});

factory实际是provider方法注册服务的简写方式。
但有一点区别,provider生成的服务可以被注入到config方法中,但是factory则不行