• angular9的学习(三)


    angular.json

    {
      "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
      "version": 1,
      "newProjectRoot": "projects",
      "projects": {
        "xxx": {...}
      },
      "defaultProject": "xxx",
      "schematics": {
        "@schematics/angular:component": {
          "prefix": "app",
          "styleext": "scss"
        },
        "@schematics/angular:directive": {
          "prefix": "app"
        }
      }
    }
    
    • $schema` 用于验证 JSON 数据格式
    • version 表示版本
    • newProjectRoot 当使用 ng generate application | library 创建新的项目时,会自动放到该目录下
    • projects 放置所有项目的配置,其中一个项目为一个子项,如 xxxx 为一个项目,在创建时自动生成
    • defaultProject 属性表示默认项目的名字。

    application 和 library 有什么区别?

    application 是一个单页面应用,而 library 是一个可以供很多应用共享的模块

    ng g applicationng new 有什么区别?

    ng new NAME 创建了一个带默认单页面应用的工作空间,ng g application 是在当前工作空间下创建一个新的应用。

    schematic 是用来做什么的?

    Angular cli 使用 @angular-devkit/schematics 生成组件、指令、模块等文件,生成的时候会有一些配置选项,例如 ng g c --skipTests --style=scss 可以生成一个不带测试文件、使用 scss 为样式文件的组件。如果每次都要手动输入这些配置就会显得麻烦,所以 angular.json 提供了 schematics 属性来统一设置一些生成类的命令配置,默认生效于所有project。每个 projects 也有这个选项,但那里的配置仅生效与单个 project 了。预设配置项有:

    • @schematics/angular:component
    • @schematics/angular:class
    • @schematics/angular:directive
    • @schematics/angular:guard
    • @schematics/angular:module
    • @schematics/angular:pipe
    • @schematics/angular:service

    component 为例,如果默认不要测试文件并使用 less,可以配置如下:

     "schematics": {
            "@schematics/angular:component": {
              "style": "less"
            }
    
    "projects": {
      "xxx": {
        "projectType": "application",
        "schematics": {},
        "root": "",
        "sourceRoot": "src",
        "prefix": "app",
        "architect": {
          "build": {...},
          "serve": {...},
          "extract-i18n": {...},
          "test": {...},
          "lint": {...}
        }
      }
    },
    
    • projectType 属性表明了项目类型是 appliaction 还是 library

    • schematics 配置应用级别的 schematics packages 的选项

    • root 属性指定了项目文件的根文件夹,可能为空

    • sourceRoot 指定了项目源文件位置

    • prefix 组件或指令的前缀

    • architect 可以自定义自动化命令

      这里面最关键的又是 architect 属性,包含了自动化命令配置

      • builder:表示要执行的内置程序,CLI内置了一些自动化工具,或者使用第三方提供的自动化工具。
      • options:表示针对当前builder所需要的配置项(调用不同的内置程序,是需要传对应的配置项的)
      • configurations:表示这个命令的多种调用模式,在此配置里可以定义不同的别名,然后使用不同的配置(配置的字段还是属于 options 里的),最后在使用命令时便可以手动选择不同的模式,例如 development 和 production。

    ng-content 内容投影

    <app-home>
        <h1>Heroic Title</h1>
        <p>Something good...</p>
    	<app-nav></app-nav>
    </app-home>   
    
    app-home.components.html
    
    <ng-content select="app-nav"></ng-content>
    <ng-content></ng-content>
    
    展示的内容就是
    	app-nav // 这个组件的内容
        <h1>Heroic Title</h1>
        <p>Something good...</p>
    
    如果是特定的属性的元素
    <ng-content select="[app-nav]"></ng-content>
    

    管道的具体使用

    创建管道

    ng g p xxx  --module=xxx
    --module是放在哪个模块里面的
    

    使用

    html
    <h1>{{'我是'|block:'1':'2':'3'}}</h1>
    
    
    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
      name: 'block',
      pure:true// 默认true 纯管道,可以不写
    })
    export class BlockPipe implements PipeTransform {
    
      transform(value: unknown, ...args: unknown[]): unknown {
        // 第一个参数是传过来的值
        console.log(value); // '我是'
        // 第二个是传过来的参数数组
        console.log(args); // ["1", "2", "3"]
        // 返回页面的东西  
        return value+'123';
      }
    
    }
    

    链式使用

    {{xxx|A|B|C}}
    就是执行A管道再执行B再执行C
    

    源码部分有时间研究下

    /node_modules/@angular/common/esm5/src/pipes/
    

    纯管道与非纯管道

    puretrue时,为纯管道,当purefalse时,为非纯管道。默认情况下,管道都是纯的。

    Angular只有在它检测到输入值发生了纯变更时才会执行纯管道。 纯变更是指对原始类型值(String、Number、Boolean、Symbol)的更改或者对对象引用(Date、Array、Function、Object)的更改。

    非纯管道在Angular的每一次变更检测中都会执行。每一次JavaScript事件之后都可能会运行变更检测:每次按键、鼠标移动、定时器以及服务器的响应。 非纯管道如果不加限制的话,其调用会变得非常频繁。

    隔行变色

    <div *ngFor="let item of arrA;let index=index;let odd=odd" 
           [class.ccc]="odd">{{item}}--{{index}}</div>
    

    如果想在组件外面加上一个样式

    @Component({
      selector: 'app-block',
      templateUrl: './block.component.html',
      styleUrls: ['./block.component.less'],
      encapsulation:ViewEncapsulation.ShadowDom
    })
    
    css
    
    :host {
          display: block;
          border: 1px solid black;
     }
    

    父传子的另一种方式

    父
    <app-refs [block]="aaa" views="aaa"></app-refs>
    ts
    public aaa=1;
    
    子组件
    @Component({
      selector: 'app-refs',
      templateUrl: './refs.component.html',
      styleUrls: ['./refs.component.less'],
      inputs: ['block','v:views'],
    })
    
     public block;
     public v;
    
      ngOnInit(): void {
        console.log(this.block);
        console.log(this.v);
      }
    

    子传父的另一种方式

    父
    <app-refs  (a)="onEvery($event)" (b)="onFive($event)"></app-refs>
    
    onEvery(e){
        console.log(e);
      }
      onFive(e){
        console.log(e);
      }
    子
    @Component({
          outputs: ['a', 'c:b']
    })
    
      public a = new EventEmitter();
      public c = new EventEmitter();
      ngOnInit(): void {
          this.a.emit('333');
          this.c.emit('444');
      }
    

    注入类

    class Greeter {
      greet(name:string) {
        return 'Hello ' + name + '!';
      }
    }
    
    @Component({
          viewProviders: [Greeter],
    })
    
    constructor(private greet:Greeter) {
        this.blockService = blockService;
      }
    ngOnInit(): void {
        console.log(this.greet.greet('xxx'));
      }
    
    

    保留空格

    比如你想行首有一个空格,因为angular 有个preserveWhitespaces: false 默认,会删除可能多余的空格

    &ngsp;进行保留空格,看到官网不是特别理解,想了好久还是没想明白,<textarea>

    <div ngPreserveWhitespaces>
     xxx   
     </div>
    

    简单的理解我们需要在某个特定的DOM元素中保留空格

    保留{{}}

    <div ngNonBindable>{{ 1 + 1 }}</div>
    
    {{1 + 1}}
    
  • 相关阅读:
    .NET Demon为Visual Studio提供持续编译和测试功能
    java面试题:字符串的排列算法
    JS实现IP地址判断
    明茨伯格管理进行时的读书感想:好书,适合有一定管理经验的人沉淀
    N个小时学MM IMG设定_存货管理和盘点 <四>
    上线第一天
    ISurfaceOp 接口生成等高线(一)
    出差合肥,路经武汉,后到长沙
    新博客
    出差合肥,路经武汉,后到长沙2
  • 原文地址:https://www.cnblogs.com/fangdongdemao/p/12617164.html
Copyright © 2020-2023  润新知