zoukankan      html  css  js  c++  java
  • angular9的学习(十四)

    简单说的一些,我的所有文章基本都是个人的差缺补漏,学习的本身本来就是查缺补漏的,其中大量的时间都是花在看资料,吸收一下有价值的东西,然后我会把一些有价值的东西提取出来,只求有生之年能成为大佬

    创建模块

    ng g m homes --route home --module app
    

    创建一个模块,在根模块appModule指定一个home的懒路由,会在homes-routing,定义一个空的homesComponent组件和路由

    验证状态的修改statusChange

     this.fromDate1.get('firstName').statusChanges.subscribe(res => {
         // res== VALID  有效的
         // invalid  无效的
         console.log(res);
         console.log(this.fromDate1.get('firstName').status);// 两个的值是一样的,都是拿到最新的校验状态
        });
    // 比如,如果验证通过我们就添加校验
    	if(res=='VALID'){
            setValidators 添加校验
    	    clearValidators  删除校验
            // 然后必须更新下才能生效
            updateValueAndValidity()
        }
    

    值修改,设置校验

    // valueChanges 是检测出值修改的
    this.password.valueChanges.subscribe(
      pwd => {
    	this.confirmPassword.setValidators([Validators.required, confirmPasswordValidator(pwd)]);        //设置校验
    	this.confirmPassword.updateValueAndValidity();// 然后更新
      }
    );
    
     get confirmPassword() {
        return this.userForm.get('confirmPassword');
      }   
    

    修改值不让出发statusChanges事件

    this.reactiveForm.get("firstname").setValue("", { emitEvent: false });
    

    只自身被触发但是父级不会被触发

    this.reactiveForm.get("firstname").setValue("", { onlySelf: true });
    

    简单的说emitEventonlySef 的效果都同时适用于valueChangesstatusChanges事件

    双向数据绑定监听绑定的值

    <input [(ngModel)]="num" (ngModelChange)="add($event)">
     add(s) {
        console.log(s);
      }
    

    官网从v6开始就不建议在表单中使用,后续可能会被废除

    但是我在v10中使用是正常的

    百分比管道PercentPipe

    {{nums|percent:'a.b-c'}}
    a 最小的整数位,默认1
    b 小数点后最小的位数,默认0
    c 小数点后最大位数,默认0
    
    num1=0.123
    {{nums|percent}}
    // 12%
    {{nums|percent:'1.2-2'}}
    // 12.30%  保留两位小数
    

    async管道

     public obs = new Observable(obser => {
        setTimeout(() => {
          obser.next('sss');
        }, 1000);
      });
    
    <div *ngIf="(obs|async) as value;else elseBlock">
      {{value}}
    </div>
    <ng-template #elseBlock>
      Observable is loading. Please wait
    </ng-template>
    

    异步管道和ngFor组合

     public obs = new Observable(obser => {
        setTimeout(() => {
          obser.next({"message":["afghan","basset","blood","english","ibizan","plott","walker"],"status":"success"}
          );
        }, 1000);
      });
    
    <ul>
      <li *ngFor="let breed of (obs|async)?.message">
        {{breed}}
      </li>
    </ul>
    =========
    <ul *ngIf="(obs|async) as breeds">
      <li *ngFor="let item of breeds.message">{{item}}</li>
    </ul>      
    

    OnChanges 生命周期

    父传子的时候,检测出每个输入属性的更改

    <app-one [count]="count"></app-one>
    <button (click)="add()">++</button>
    <button (click)="methods()">--</button>
    ------------
     public count = 1;
      add(): void {
        this.count++;
      }
      methods(): void {
        this.count--;
      }
    

    接受属性,利用OnChanges 检测每个值的修改
    
      @Input('count') count;
      ngOnChanges(changes: SimpleChanges): void {
        console.log(changes);
    
      }
    
    previousValue:any 之前的值
    currentValue:any 新值
    firstChange():boolean 是否是第一次的值Boolean

    Form 禁用启用

    禁用某个值
     this.reactiveForm.get("email").disable();
    启用某个值
     this.reactiveForm.get("address").enable();
    禁用所有
    this.reactiveForm.disable();
    启用所有
    this.reactiveForm.enable();
    

    FormArray 添加某个值

    newSkill(): FormGroup {
       return this.fb.group({
         skill: '',
         exp: '',
       })
    }
    // 动态增加
    addSkills() {
       this.skills.push(this.newSkill());
    }
    

    FormArray 删除元素

    this.skills.removeAt(i)
    

    FormArray的使用

      <div formArrayName="skills">
        <div *ngFor="let skill of skills().controls; let i=index">
          <div [formGroupName]="i">
            {{i}}
            skill name :
            <input type="text" formControlName="skill">
            exp:
            <input type="text" formControlName="exp">
     
            <button (click)="removeSkill(i)">Remove</button>
          </div>
        </div>
      </div>
    

    拿到FormArray 的某一项

      this.teachersForm = this.fb.group({
          teachers: this.fb.array([
              this.fb.group({
         		 name: '',
       			 batches: this.fb.array([])
      			  })
          ]),
        })
    // 拿到数组
     teachers(): FormArray {
        return this.teachersForm.get("teachers") as FormArray
      }
    // 拿到某个子数组的 batches
      batches(ti): FormArray {
        return this.teachers().at(ti).get("batches") as FormArray
      }
    

    下拉框提示语

     <select formControlName="country">
        <option [ngValue]="null" disabled>提示语</option>
        <option *ngFor="let country of countries" [ngValue]="country.id">{{country.name}}</option>
      </select>
    

    Form 验证器

    firstname: new FormControl('',[Validators.required,Validators.minLength(10),Validators.maxLength(15),Validators.pattern("^[a-zA-Z]+$"),Validators.email]),
    

    禁用提交

    <button type="submit" [disabled]="!contactForm.valid">Submit</button>
    

    错误信息

      <div
        *ngIf="!firstname?.valid && (firstname?.dirty ||firstname?.touched)">
        <div [hidden]="!firstname.errors.required">
          First Name is required
        </div>
        <div [hidden]="!firstname.errors.minlength">
          Min Length is 10
        </div>
      </div>
    

    发现一个重要的忽略的知识点,自定义校验器,传递参数

    export function gte(val: number): ValidatorFn {
      return (control: AbstractControl): ValidationErrors | null => {
        let v: number = +control.value;
        if (isNaN(v)) {
          return { 'gte': true, 'requiredValue': val }
        }
        if (v <= +val) {
          return { 'gte': true, 'requiredValue': val }
        }
        return null;
      }
    }
    
    public teaForm: FormGroup;
    this.teaForm = this.fb.group({
          firstName: ['',[gte(10)]]
        });
    
  • 相关阅读:
    为什么你应该(从现在开始就)写博客
    ASP.net 中使用Flexigrid详细教程之二直接使用数据库数据(有图有真相)
    保护眼睛的方法 (眼睛累了吗 来看看吧)
    程序员不如快递员?
    项目管理界面
    地址栏射击游戏!对,你没看错,就是在地址栏上玩的游戏,有图有真相!
    书写是为了更好的思考
    IT人员如何找到自己的时间?
    std::mem_fun_ref,mem_fun1_ref分析
    __declspec(selectany) 的作用是什么
  • 原文地址:https://www.cnblogs.com/fangdongdemao/p/13267535.html
Copyright © 2011-2022 走看看