Angular 响应式编程相关

-------------------------------------------------------------------------------------------------

rxjs6 中需要导入 import 'rxjs/Rx'

创建一个流并观察(订阅)它:

Observable.from([1,2,3,4]).filter(e => e%2 == 0).map(e => e*e).subscribe(e => console.log(e), err => console.error(err), () => console.log('结束'));

----------------------------以上写法不推荐---------------------------------------------

rxjs6版本, 可以直接使用 from() 来创建一个流, 所有filter, map等操作要写在 pipe()函数里面当做参数.

--------------------------------------------------------------------------------------------------------------------

Observable是一个流, subscribe监听一个流(订阅)它是一个观察者

模板本地变量 : <input #myField (keyup)="onKey(myField.value)"> 这样可以直接用string类型接收myField.value的值
用#xxx来声明一个变量,使用变量时不需要加#

angular的forms模块中有一个ReactiveFormsModule做响应式编程的模块,有一个对象FormControl可以用它来进行响应式表单验证

模板里面用 [formControl]="titleFilter" 把input和控制器里面的titleFilter绑在一起

private titleFilter: FormControl = new FormControl();

constructor(private productService: ProductService) {
this.titleFilter.valueChanges
.subscribe(
value => {xxxxxxxx;}
);
}

上面的例子是订阅它的valueChanges 事件流

Angular 组件间通信相关

-------------------------------------------------------------------------------------------------

父子组件间传递数据 子组件用@Input装饰的变量接收,父组件用 [xxx]=yyy的方式在子组件标签内传值,子组件数据的变化不会影响父组件

组件往父组件发射数据用 EventEmitter 可以这样写:

@Output('这里面可以写事件名字')
aObj: EventEmitter<Obj> = new EventEmitter;

aObj.emit(aObj)

EventEmitter<Obj> 表示往外发射的数据类型是一个Obj类型,那么用emit方法发射数据的aObj必须是一个Obj类型

捕获发射的数据需要用 (事件名字)="xxxxHandler($event)" 控制器里面用 xxxxHandler(event: Obj) 来接收这个event就是发射出来的Obj类型的数据, 如果@Output发射的EventEmitter对象名字(aObj)是xxxChange,并且@Input的名字也是xxx,那么可以直接在父组件中用[(xxx)]="yyy"这种语法双向绑定.

-----------------------------------------------------------------------------------------------------

中间人是两个组件共同的父组件,可以先捕获一个组件发射出来的数据 (事件名字)="xxxxHandler($event)" 然后在传给另一个子组件 [xxxxx]="xxxxxx"

-----------------------------------------------------------------------------------------------------

在父组件控制器中调用子组件的方法. 首先在父组件模板中 <app-child #child1></app-child> 给子组件声明一个模板本地变量

然后在控制器中用下面这个装饰器来声明一个ChildComponent类型的对象. 然后可以用 child1.xxx() 来调用子组件的方法.

@viewChild("child1")
child1: ChildComponent;

也可以直接在父组件的模板中用 (click)="child1.xxx()" 的方式来调用子组件的方法. 这两种方式都需要声明子组件的模板本地变量(尽量避免使用@viewChild这种方式调用方法,因为这会造成紧耦合)

-----------------------------------------------------------------------------------------------------

投影:可以把父组件的html投影到子组件中去,首先在子组件模板中用<ng-content></ng-content>标记一个投影点,然后在父组件中用 <app-child>要投影到子组件中的html<app-child>, 还可以有多个投影.如父组件模板中给需要投影的html一个类,那么子组件就用 <ng-content select=".xxx类名"></ng-content> 的方式来表名要把那一段代码投影到这上面.

Angular 表单相关

-------------------------------------------------------------------------------------------------

如果是模板表单,需要引入 FormsModule 如果是响应式表单需要引入 ReactiveFormsModule

angular会在所有表单上自动添加 ngForm 指令 ,会隐式创建一个 FormGroup类的实例,如果不想让angular接管表单,需要在表单上添加 ngNoForm . ngForm指令也可以添加到div上.移除html默认验证用 novalidate

ngForm 会扫描所有 标有 ngModel的子元素并将他们的值添加到表单数据模型中.

ngmodel在表单里面不用加 [()] 直接写一个 ngModel 就可以 ,他会隐式创建一个FormControl类的实例

可以用模板本地变量的方式给一个表单声明:#myForm="ngForm" 然后用 (ngSubmit)="onSubmit(myForm.value)" 这种方式指定提交的函数.以及把form里面 ngmodel元素的值传给函数

ngModelGroup 可以把一部分表单字段组成一个组,嵌套在表单里面,形成一个元素,也会隐式创建一个FormGroup的类的实例.<div ngModelGroup="useInfo">嵌套的表单元素</div>

----------------------------------------------------------------------------------------------------------

响应式表单 的三个类 : FormControl 可以理解为一个表单元素, FormGroup 多个FormControl的对象的形式(key, value)
FormArray 多个FormControl 的数组的形式. 提交用(submit)="onSubmit()"

响应式表单的指令: 如下图

(其中 formGroup和formControl指令不能嵌套存在, formGroup可以用在表单上, formControl适合绑定单独的input框, 在formGroup里面只能也必须使用带name的三个指令, 三个带name的指令不能用数据绑定的方式绑定)

构建数据模型的时候可以直接用 FormBuilder 需要在构造函数中注入进去 constructor(fb: FormBuilder) 简单例子:

constructor(private fb: FormBuilder) {
this.formModel = fb.group({
username: [''],
mobile: [''],
passwordsGroup: fb.group({
password: [''],
pconfirm: ['']
})
});
}

其中每个字段的[''](不一定加单引号,这里是因为都是字符串)里面都可以有三个字段,第一个是默认值,第二个是校验器,第三个是异步的校验器,angular预定义好的校验器是 Validators 这个类里面的静态方法.如 username: username: ['', [Validators.required, Validators.minLength(6)]],
可以用 let isValid: boolean = this.formModel.get('username').valid; 这种方式取出是否符合校验规则的值.符合为true
还可以用 let errors: any = this.formModel.get('username').errors; 这种方式取出校验错误信息.

自定义校验器的demo: 只有formModel里面所有字段都符合校验器,那么 formModel.valid才为true.
注意:自定义校验器如果通过的话,一定要返回 null.

------------------------------------------------------------------------------------------------------

mobileValidator(control: FormControl): any {
var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
let valid = myreg.test(control.value);
console.log("校验结果"+valid);
return valid ? null : {mobile: true};
}

equalValidator(group: FormGroup): any {
let password: FormControl = group.get('password') as FormControl;
let pconfirm: FormControl = group.get('pconfirm') as FormControl;
let valid: boolean = (password.value === pconfirm.value);
console.log('密码是否相等'+valid);
return valid ? null : {equal: true};
}

formModel: FormGroup;

constructor(private fb: FormBuilder) {
this.formModel = fb.group({
username: ['', [Validators.required, Validators.minLength(6)]],
mobile: ['', this.mobileValidator],
passwordsGroup: fb.group({
password: [''],
pconfirm: ['']
}, {validator: this.equalValidator})
});
}

------------------------------------------------------------------------------------------------------

注意,  判断校验是否正确 在模板中, 一种是  formModel.get('username').hasError('required') 还有就是 formModel.hashError('required', 'username')

Angular : 响应式编程, 组件间通信, 表单的更多相关文章

  1. angular响应式编程

    1.响应式编程 例子import {Observable} from "rxjs/Observable"; Observable.from([1,2,3,4]) .filter(( ...

  2. Angular09 数据绑定、响应式编程、管道

    1 数据绑定的分类 1.1 单向数据绑定 1.1.1 属性绑定 -> 数据从组件控制类到组件模板 DOM属性绑定 HTML属性绑定 1.1.2 事件绑定 -> 数据从组件模板到组件控制类 ...

  3. Angular6 基础(数据绑定、生命周期、父子组件通讯、响应式编程)

    Angular相比于vue来说,更像一个完整的框架,本身就集成了很多模块,如路由,HTTP,服务等,而vue是需要另外引入比如(vuex,axios等).Angular引入了依赖注入.单元测试.类等后 ...

  4. 【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例

    目录 一. 划重点 二. Angular应用中的Http请求 三. 使用Rxjs构建Http请求结果的处理管道 3.1 基本示例 3.2 常见的操作符 四. 冷热Observable的两种典型场景 4 ...

  5. vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单

    参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...

  6. Rx响应式编程

    RX响应式编程就是异步数据流编程:单击事件或事件总线;(观察者模式) 有一堆的函数能够创建流,也能将任何流-,也能将任何流进行组合和过滤.一个流能够作为另一个流的输入,能够将两个流合并,可以通过过滤流 ...

  7. Spring 5 响应式编程

    要点 Reactor 是一个运行在 Java8 之上的响应式流框架,它提供了一组响应式风格的 API 除了个别 API 上的区别,它的原理跟 RxJava 很相似 它是第四代响应式框架,支持操作融合, ...

  8. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...

  9. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

随机推荐

  1. Android 时间范围选择器PickTimeDialog

    个人提供了自己封装的第三方时间选择器,能够自定义时间格式,以及设置时间范围. 基础使用 PickTimeDialog pickDilog= new PickTimeDialog(this).setMa ...

  2. 【Mood-15】DailyBuild 1月

    keywords: AsyncImageLoader universal-image-loader 2015-01-07 AsyncImageLoader:异步动态加载网络图片  类似listview ...

  3. SQLServer存储过程 实例,很多语法可以以后参考

    SQL代码 alter PROCEDURE sp_addnewdtgtype ( ), @dtgdllcontent image, ) ) AS BEGIN ); declare @v_count i ...

  4. sqlplus中设置在屏幕中上不打印出输出

    在某些特定的情况下我们想在做某种实验,需要执行一段sql语句,但是不想在屏幕上打印出sql语句的结果(太长了)可以采用如下方式.1    把想要执行的语句写到一个sql脚本中,例如:[oracle@i ...

  5. Oracle分区表分批迁移

    遇到个分区表数据量超大的case,磁盘空间不够,所以考虑使用数据泵分批导数据,测试如下: source : oracle windows 32bit 10.2.0.1target  :  oracle ...

  6. Oracle SYS用户无法设置session级别的read only

    官方文档参考:SYSDBA is used internally in the Oracle database and has specialized functions. Its behavior ...

  7. E. XOR and Favorite Number

    题意:很多询问,求每个询问下,有多少个区间,异或=k. 分析:异或也有前缀和.[L,R] = pre[R] ^ pre[L-1]: 莫队算法:是莫涛队长发明的,一种改良版的暴力离线算法. 首先将问题重 ...

  8. HDU1215 七夕节(模拟 数学)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1215 七夕节 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  9. 提高mapreduce性能的七点建议

    Cloudera提供给客户的服务内容之一就是调整和优化MapReduce job执行性能.MapReduce和HDFS组成一个复杂的分布式系统,并且它们运行着各式各样用户的代码,这样导致没有一个快速有 ...

  10. 01_常用 Linux 命令的基本使用

    01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在职场中,大量的 服务器维护工作 都 ...