angular2 系列教程(二)组件
一. 组件
- 创建组件: ng g c login -it -is (完整写法: ng generate component login --inline-template --inline-style)
- 其中“-it -is”代表生成组件的时候将HTML和CSS样式放在同一个文件中
- 引用组件:在根组件的模版“app.component.html”中加入我们的组件引用 <app-login></app-login>
- 组件组成:
- @Component
- selector :定义引用时候的名称
- template:html模版
- styles:样式
- providers:配置要引用的类的实例,一般是service
- export class xxxComponent
- @Component
- 编写template中的模版
-
事件绑定:
- 写法:(触发方式)=“触发函数”
- 例子:“ <button (click)="onClick()">Login</button>”(其中“onclick()”写在class中)
-
数据绑定:
- 分类:
-
本类中引用:
- 写法:在html标签中添加“#reference”,则reference代表这个标签
- 例子:
- 注:上面例子,对应class中函数也要写对应参数接收值:“onClick(username){...}”
-
双向数据绑定:
- 在根模块" app.module.ts"中的imports中添加“FormsModule”
- 在xxxComponent中
- 在export class xxxComponent中添加成员变量
- 例子:“username : string”
- 在模版的html的标签中添加属性:[(ngModule)]=“username”(形象记法:banana-in-box)
- 引用方式是:“ this.成员变量”
- 例子:“this.username”
- 在export class xxxComponent中添加成员变量
- 注意:
- 使用双向数据绑定之后,则事件绑定中的函数不需要再有接收参数,参数直接用“this.成员变量”即可,因为已经绑定了
- 当双向绑定后想要对表单数据进行验证时,改为 #reference="ngModel",因为reference需要在模版中引用,如果不是,则不需要加
- 单向数据绑定:
- []="username" 是将方括号中的值赋值给username这个input控件
- ()="username" 是将username的值赋值给圆括号中的变量
-
本类中引用:
- 分类:
- 差值表达式:
- 写法:{{表达式}}
- 应用场景:当表单需要进行验证的时候,在input标签中添加对应属性,然后用差值表达式对属性进行验证(双向绑定+引用)
- 例子:
- 例子中添加了required,表示不能为必填项,本例如果不为空,差值表达式为true
- 例子:
-
事件绑定:
-
将服务注入到组件中
- 创建服务:“ ng g s auth”
- 服务组成:
- @Injectable
- provideIn:
- export class xxxService
- @Injectable
-
注入方式:
- 需要在组建中导入service类
- xxxComponent中:
- 导入service类:“import { AuthService } from '../core/auth.service';”
- 在装饰器中将其实例化:“constructor(private service: AuthService) { }”
- xxxComponent中:
- 不需要再组件中导入service类
- 在根模块" app.module.ts"中配置他的providers(providers作用是配置在模块中全局可用的service或参数)
- xxxComponent中:
- 装饰器中引用全局可用的service“auth”:“constructor(@Inject('auth') private service) { }”
- 在根模块" app.module.ts"中配置他的providers(providers作用是配置在模块中全局可用的service或参数)
- 需要在组建中导入service类
-
通过@Input和@Output在组件之间传值
- 父组件(a)给子组件(b)传值[email protected]
- 父组件调用子组件的时候传入数据,在组件a的模版中添加"<app-b [参数abc]="todos?.length"></app-b>"
- 在b组件bComponment中添加@Input用来接收a组件中传来的值
- 子组件中使用父组件的数据“<h2>{{参数abc}}</h2>”
- 父子组件传值的方式,让子组件执行父组件的方法:
- 父组件定义方法
- 调用子组件传入当前方法
- 子组件接收父组件传过来的方法
- 子组件使用父组件的方法
- 父组件定义方法
- 子组件(b)通过@Output 执行父组件(a)的方法
- 在a组件的模版中添加"<app-b (事件abc)="addTodo()"></app-b>"
- 在b组件bComponment中添加@Output用来定义事件“@Output() 事件abc = new EventEmitter<string>();”
- 父组件通过局部变量获取子组件的引用 ,主动获取子组件的数据和方法
- 定义子组件footer
- 父组件调用子组件的时候给子组件起个名字
- 直接获取执行子组件的方法
- 定义子组件footer
- 父组件通过局部变量获取子组件的引用,通过ViewChild主动获取子组件的数据和方法
- 调用子组件,给子组件定义一个名称
- 引入ViewChild,和刚才的子组件关联
- 调用子组件
- 调用子组件,给子组件定义一个名称
- 父组件(a)给子组件(b)传值[email protected]
-
管道
- 作用:将数据格式化显示,而不改变源数据
- 写法:“{{ 输入数据 | 管道 : 管道参数 }}”
- 注意:管道可以向jq一样链式调用:“{{ data | Pipe1 | Pipe2 | Pipe3 | ... }}”
- 自定义管道
- 步骤:
- 创建自定义管道:
- 使用自定义管道:
- 创建自定义管道:
- 步骤:
- 扩展
- 当form表单验证的时候
- 如果验证通过,则input的class是“.ng-valid”
- 如果验证不通过,则input的class是“.ng-invalid”
- 由上可知,可以通过验证通过和不通过对表单设置不一样的样式
- 在xxxComponent中编辑styles
- 当form表单验证的时候