1.全局安装 Angular CLI
npm install -g @angular/cli
ng new my-app
cd my-app
ng serve --open --port 端口号
--port 可以不加 默认4200端口
2.组件创建(通过命令)
ng generate component heroui
CLI 自动生成了三个元数据属性:
1.selector— 组件的选择器(CSS 元素选择器)
2.templateUrl— 组件模板文件的位置。
3.styleUrls— 组件私有 CSS 样式表文件的位置。
CSS 元素选择器可以模版中作为组件 <app-heroes></app-heroes>
用来在父组件的模板中匹配 HTML 元素的名称,以识别出该组件。
3.组件传值
通过动态绑定一个属性用 []包裹起来 后面跟着要传的参数
子组件通过@Input() 接受(注意Input需要进行引入)
子传父:
如上图需要引入EventEmiter 和 Output然后实例化EventEmiter
然后通过事件来触发器实例化的那个对象用emit来把事件携带出去
父组件接受这个值需要自定义一个事件在conponent接受
非父子组件传值:
一般通过service来实现。这就需要涉及一个angular很重要的概念-依赖注入
一个服务(service)需要注入到app 里面的providers 依赖注入的时候,会优先检查注入的模块中有没有,然后再从根模块providers中查找
可以通过命令生成一个service:
ng generate service hero
@injectable就是我们俗称的装饰器,他把这个类标记为依赖注入系统参与者之一。这个类也就是HeroService,这个类他会提供一个可以注入的服务,并且还可以拥有自己带注入的依赖
@Injectable() 装饰器会接受该服务的元数据对象,就像 @Component() 对组件类的作用一样。
准备注入:
Angular只会绑定到组件的公共属性
以上所谓的service只是一个小demo真正开发请求数据一定是异步获取的,所以他可以返回promise等也可以返回一个Observable(可观察对象)
Observable 是 RxJS 库中的一个关键类。
上面说到服务中也可以被注入服务
4.路由
(1)在 Angular 中,最好在一个独立的顶级模块中加载和配置路由器,它专注于路由功能,然后由根模块 AppModule 导入它。
(2)按照惯例,这个模块类的名字叫做 AppRoutingModule,并且位于 src/app 下的 app-routing.module.ts 文件中。
使用CLI生成:
ng generate module app-routing --flat --module=app
--flat 把这个文件放进了 src/app 中,而不是单独的目录中。
--module=app 告诉 CLI 把它注册到 AppModule 的 imports 数组中。
生成的文件
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule
],
declarations: []
})
export class AppRoutingModule { }
但是你通常不会在路由模块中声明组件,所以可以删除 @NgModule.declarations 并删除对 CommonModule 的引用。
你将会使用 RouterModule 中的 Routes 类来配置路由器,所以还要从 @angular/router 库中导入这两个符号
添加一个 @NgModule.exports 数组,其中放上 RouterModule 。 导出 RouterModule 让路由器的相关指令可以在 AppModule 中的组件中使用。
路由定义 会告诉路由器,当用户点击某个链接或者在浏览器地址栏中输入某个 URL 时,要显示哪个视图。
典型的 Angular 路由(Route)有两个属性:
path:一个用于匹配浏览器地址栏中 URL 的字符串。
component:当导航到此路由时,路由器应该创建哪个组件。
如果你希望当 URL 为 localhost:4200/heroes 时,就导航到 HeroesComponent。
首先要导入 HeroesComponent,以便能在 Route 中引用它。 然后定义一个路由数组,其中的某个路由是指向这个组件的。
你必须首先初始化路由器,并让它开始监听浏览器中的地址变化。
把 RouterModule 添加到 @NgModule.imports 数组中,并用 routes 来配置它。你只要调用 imports 数组中的 RouterModule.forRoot() 函数就行了。
imports: [ RouterModule.forRoot(routes) ],
这个方法之所以叫 forRoot(),是因为你要在应用的顶级配置这个路由器。 forRoot() 方法会提供路由所需的服务提供商和指令,还会基于浏览器的当前 URL 执行首次导航。
路由出口 :
<router-outlet></router-outlet>
<router-outlet> 会告诉路由器要在哪里显示路由的视图。
注意:
能在 AppComponent 中使用 RouterOutlet,是因为 AppModule 导入了 AppRoutingModule,而 AppRoutingModule 中导出了 RouterModule。
路由切换:
1先导入这三个语句
然后把 ActivatedRoute、HeroService 和 Location 服务注入到构造函数中,将它们的值保存到私有变量里:
1.这个this.snapshot.paramMap.get()是一个路由信息的抓取快照,抓取自组件刚刚创建完毕
2.还有一种形式:this.activatedRoute.snapshot.params['id']也是可以
3.this.activatedRoute.params.subscribe((params)=>{
},()=>{
},()=>{
})
第三种一般接受三个参数
注意:最后两种需要依赖注入 activatedRoute
组件接受(2) 路由重定向:
pathMath的value值一般有两个 full和 prefix第一个指的是完全匹配,
编程式导航:
- navigate
也需要注入依赖 activatedRoute
this.activatedRoute.navigate(['home'],queryParams:{name:'',....})
通过navifatebyurl路径跳转方式
如果传的是对象的话就可以通过Json方式转换一下
接收:
2.location 需要依赖注入localtion
this.location.back()
this.location.gorward()
注意:路由传参数如果一个参数就需要在路由配置表里面配置,如果是多个就不需要了