![前端知识点总结——Angular(持续更新中)](http://p2.ttnews.xyz/loading.gif)
一、Angular概述
基于命令行的开发方式?
①hotreload
②编译工作
③集成了webpack打包工具。。。。
angular.cn中文angular.io正式官网angular.cn/guide/styleguide风格指南
1、what?
angular是一个Google推出的js框架,是以模块为基本单位,模块又可以包含组件、指令、过滤器。。
1.1版本问题
angularangular2.0以后所有的版本统称为angular
(当前学习ng4.0)
angular.jsangular1.*统称为angular.js
(http://www.runoob.com/angularjs/angularjs-tutorial.html)
1.2版本之间的区别
①新版本是有组件的概念的
②老版本是$scope和controller为主
③angular引入了rxjs
④angular采用ts(typescript是es6的超集,是由微软和谷歌)ts是一种强类型检查机制的语言
⑤angular可读性、提高了代码的复用率、维护成本变低。。。
2、where
可以使用支持angular的Ionic框架来实现移动端的开发,直接使用angular来实现pc端的开发
实现操作比较频繁的SPA
3、why
①遵循w3c所推出的webComponent标准(组件化)②代码具有更好的可读性和可维护性、③引入了更多的高效率的工具,比如rxjs\immutable.js。。。,让代码的编译、部署更简单④ts--》健壮
4、how
angular的开发整体框架,是有8大组成部分构成
搭建环境的方式:方式1:
①下载quickstart-master.zip压缩包
https://github.com/angular/quickstartdownload
或者直接拷贝老师提供的压缩包
②解压缩压缩包,进入对应的目录中
执行npminstall 安装项目所需要用到的依赖
③npmstart 启动开发服务器
方式2:
AngularCLI是一个命令行界面工具,它可以创建项目、
添加文件以及执行一大堆开发任务,比如测试、打包和发布。
//安装基于angular的命令工具
npminstall -g@angular/cli
//创建一个有着ng模板的项目
ngnewmy-app
//进入当前目录下的my-app
cdmy-app
//启动开发服务器
ngserve --open
二、Angular模板项目的启动流程
index.html
main.js(main.ts)-->启动一个模块AppModule
app/app.module.ts--->启动一个组件app/app.component.ts
HelloAngular
三、完成组件的创建和使用
1、创建组件和使用组件
①创建文件app/test/test.component.ts
②将类装饰成一个组件类
import{Component}from'@angular/core'
@Component({
selector:'test',
template:`
itis a test
`})
exportclassDemo01Component{
}
③使用组件
app.module.ts中,
import{TestComponent}from'./test/test.component'
@NgModule({
declarations:[TestComponent]
})
②<test>
练习:(16:50-17:00)
demo02/demo02.component.ts
组件中渲染一个无序列表(5个列表)
将组件渲染AppComponent
四、Angular中常见的指令
1、循环指令Vue: <anyv-for>
Angular:
语法:
2、选择指令Vue:<anyv-if>
angular:
五、常见指令
指令和组件的关系:
组件就是一个带有模板的指令!!!
1、多重分支判断
vue
v-if
v-else-if
v-else
2、属性绑定
Vue:
<class>
<style>
Angular:
<button>
3、事件绑定
Vue
<click>
<button>Angular
语法:
举例:
<button>
4、双向数据绑定
Vue:
Angular:
依赖注入:
将依赖的东西注入到指定的地方,让依赖可被使用
举例:AppModule依赖于FormsModule,
只需要在AppModule的imports数组写上FormsModule名称
就可以使用FormsModule所提供的东西。
好处:解耦,降低了耦合度
Angular中如果想要监听双向数据绑定数据的变化,提供一个事件ngModelChange
注意事项:①Angular中如果要想使用双向数据绑定,就必须指定模块依赖于FormsModule②使用ngModelChange事件时,通过$event去传递用户当前所输入的信息
(ngModelChange)="handleChange($event)"
内置的指令:
*ngFor*ngIf*ngSwitchCase*ngSwitchDefault
ngSwitch[]()[(ngModel)]{{}}
5、自定义指令
Vue中自定义指令:
Vue.directive('change',{
bind:function(el,binding){},
update:function(){},
unbind:function(){}
});
v-changeAngular中指令创建和使用
5.1创建
import{Directive} from'@angular/core'
@Directive({
selector:'[test]'
})
exportclassTestDirective{
}
5.2使用
app.module.ts
import{TestDirective}from'***'
@NgModule({
declarations:[TestDirective]
})
②作为标签的属性
<h1test>
5.3得到调用指令的元素
①import{ElementRef}from'@angular/core'
②实例化
constructor(privateel:ElementRef){}
③读取元素
this.el.nativeElement
5.4指令调用时传参??
①<h1test>
②在指令类的内部
import{Input}from'@angular/core'
@Input()test="";
this.test
补充:使用生命周期的处理函数?
①引入
import{OnDestroy}from'@angular/core'
②在定义类的时候实现接口类
exportclassTestimplementsOnDestroy{
ngOnDestroy(){}
}
六、组件之间通信
Vue中组件通信的方式?
①propsdown
步骤1:发送
<sonmyname>
步骤2:接收
Vue.component('son',{
props:['myName']
})
②eventsup(子-》父)
步骤1:事件的绑定
methods:{
rcvMsg:function(msg){}
}
步骤2:事件的触发(儿子)
this.$emit('customEvent',123);
③$refs$parent
④busAngular中组件通信?
1、propsdown
步骤1:发送
<sonuname>
步骤2:接收
import{Input}from'@angular/core'
@Input()uName="";
this.uName
2、eventsup
步骤1:事件和处理函数的绑定
定义一个方法
rcvMsg(msg){}
步骤2:触发事件
子组件触发
import{Output,EventEmitter} from '@angular/core'
@Output()toFatherEvent = new EventEmiiter();
this.toFatherEvent.emit('123');
我们是这样写Angular应用的:
用Angular扩展语法编写HTML模板,用组件类管理这些模板,用服务添加应用逻辑,用模块打包发布组件与服务。
七、管道(pipe)
管道是用来对数据进行筛选、过滤、格式化
Vue中过滤器:
Vue.filter('changeSex',function(arg,arg1,arg2){
return处理后的结果
})
angular中管道:
过滤器的本质就是一个有参数有返回值的方法
语法:
{{expression|pipe1:'12':34|pipe2}}
1、内置管道
常见内置管道:
uppercase/lowercase/date/number/slice
2、自定义管道
创建一个自定义管道:
import{Pipe,PipeTransform}from'@angular/core'
@Pipe({
name:'testNG'
})
exportclassTestPipeimplementsPipeTransform{
//value是竖杠前表达式执行的结果
//args通过调用管道时,冒号后边跟的参数
transfrom(value:any,...args:[]):any{
return‘处理后的结果’
}
}
调用:
②调用
和内置管道的用法是一样的,同样支持传参、多重过滤
八、服务(依赖注入)
服务service:服务的本质是一个类,在服务类中封装的是经常用到的数据和方法。
常见的服务:日志类服务、心跳服务、网络请求服务。。。
1、服务的创建和使用
创建:
import{Injectable}from'@angular/core'
@Injectable()
exportclassUserService{
constructor(){}
checkUserLogin(){returntrue}
}
使用:
①需要给服务指定provider
在组件中或者模块中指定providers:[UserService]
②调用
import{UserService}from'./***'
constructor(privatemyService:UserService){}
this.myService.checkUserLogin()
2、如何封装一个网络请求的服务
①创建服务的文件
②在服务中封装一个方法
sendRequest(myUrl:string){
return this.http.get(myUrl).map((response)=>
response.json()
)
}
③调用之前首先指定providers
④到组件中,先引入,再实例化,再调用
this.myHS.sendRequest().subscribe((result)=>{
//result就是服务器端返回的结果!
})
与服务器端通信如果涉及的session,angular需要这么处理:
客户端
①发起请求withCredentials:true
this.http.get(
myUrl,
{withCredentials:true}
)
服务器端:
①跨域header('Access-Control-Allow-Origin:http://localhost:3000');
②服务器允许接收凭证
header('Access-Control-Allow-Credentials:true');
服务创建和使用:
1、创建一个文件test.service.ts
2、在文件中编写代码,装饰一个服务
@Injectable()
exportclassTestService{
showAlert(msg){
alert(msg);
}
}
3、 给模块或者组件,在providers属性对应的数组中[TestService]
4、组件中要想使用服务中的方法
import{TestService}from'***'
constructor(privatemyService:TestService){}
this.myService.showAlert()
Angular中开发模式:
我们是这样写Angular应用的:用Angular扩展语法编写HTML模板,用组件类管理这些模板,用服务添加应用逻辑,用模块打包发布组件与服务。
然后,我们通过引导根模块来启动该应用。Angular在浏览器中接管、展现应用的内容,并根据我们提供的操作指令响应用户的交互。
在Angular开发时,八大组成部分:
1、模块2、组件3、模板自带的html标签+指令、绑定相关的ng的语法4、元数据告诉Angular如何处理一个类。5、数据绑定
{{}}()[][(ngModel)]6、指令
三大类:组件、结构型、属性型7、服务
封装一些数据和方法8、依赖注入
就是将依赖的服务、模块注入到指定组件、模块中取使用,提供了一种新的实例化的方式(解耦)
九、路由模块
路由模块:建立起url和页面之间的映射关系1、实现SPA的基本步骤
Vue:实现一个SPA基本思路:①指定一个容器
<router-view>②创建代码片段
创建组件
varLogin=Vue.component('login-component',{
template:`
登录页面
`})③配置路由词典
newVue({
router:newVueRouter({
routes:[
{path:'/myLogin',component:Login}
]
})
})④测试
测试路由词典中路由地址能否按照需求正确加载所需要用到的页面
Angular:①指定容器
@Component({})exportclass**③配置路由词典
//a-module-routing
import{Routes,RouterModule}from'@angular/router'
import{LoginComponent}from'./demo15_spa/login.component'
constroutes:Routes=[
{path:'',component:LoginComponent}
.....
]
@NgModule({
import:[RouterModule.forRoot(routes)],
exports:[RouterModule]
})
exportclassAppRoutingModule{}
找到跟模块:
import{AppRoutingModule}from'./app.router'
@NgModule({
imports:[AppRoutingModule]
})④测试
2、在Angular实现组件间的导航的方式
Vue写法:
①可以直接修改地址栏(内部测试)
②可以通过js
this.$router.push('目的地的路由地址')
③routerLink
<router-linkto>Angular:①直接修改地址栏②js /<router-linkto>
import{Router}from'@angular/router'
constructor(privatemyRouter:Router){}
this.myRouter.navigateByUrl('url');③<arouterlink>
补充:实现前进和后退
import{Location}from'@angular/common'
constructor(privatemyLocation:Location){}
this.myLocation.back(); this.myLocation.forward();
3、参数的传递
Angular:
3.1发送
this.myRouter.navigateByUrl('myOC/123');
3.2接收
①配置接收方的路由地址
{path:'myOC'}==>{path:'myOC/:price'}
②接收参数
import{ActivatedRoute}from'@angular/router'
constructor(privatemyAR:ActivatedRoute){}
this.myAR.params.subscribe((result)=>{
//result.price
})
在Angular中实现数据传输的方式:
①组件间通信
②跳转时指定参数
③与远程服务器端通信
4、路由嵌套
可以在SPA中某个组件中,根据url嵌套其它的组件
Vue中实现方式:
①在准备嵌套其它组件的,指定一个容器<router-view>
②配置路由词典
{
path:'',
component:MailComponent,
children:[
{path:'inbox',component:***}
]
}
Angular中实现方式:
①指定容器
router-outlet
②配置子路由
{
path:'mail',
children:[
...
]
}
总结:在Angular中实现一个支持路由嵌套的SPA,
导航到对应的子路由对应的页面时,必须在携带父组件的地址
localhost:3000/mail/outbox
localhost:3000/mail/inbox
demo18_embed
mylogin.component.ts MyLoginComponent
mail.component.tsMailComponent
inbox.component.tsInboxComponent
outbox.component.tsOutboxComponent
②路由模块
5、路由守卫
路由守卫RouteGuard,控制是否能够访问某一个url中所对应的组件!
鉴权的组件
用户登录的页面
。。。
如何使用路由守卫:
①创建一个服务
import{Injecatable}from'@angular/core'
import{CanActivate}from'@angular/router'
@Injectable()
exportclassMailGuardimplments CanActivate{
canActivate(){
returntrue/false
}
}
②给服务指定提供商
providers:[MailGuard]
③给路由词典中想要保护的路由指定canActivate
{
path:'mail',
canActivate:[MailGuard]
}
Vue中如果也想实现路由守卫:
constrouter =newVueRouter({...})
router.beforeEach((to,from,next)=>{
//...
})
https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
![前端知识点总结——Angular(持续更新中)](http://p2.ttnews.xyz/loading.gif)
閱讀更多 渡一教育web前端開發 的文章