3

表单

Angular 18中公开一个名为 events 的属性,它允许您订阅事件流对于这个表单控件,并且对从它继承的所有类都可用:FormControl, FormGroup, FormRecord和FormArray。使用它您可以跟踪值、触摸状态、原始状态和控制状态的变化。
下面定义了FormControl,让我们一起看看吧:

name = new FormControl<string>("");

ngOnInit(): void {
    this.name.events.subscribe(event => {
      console.log(event);
    });
  }

// html 
输入:<input type="text" [formControl]="name" />

当输入值的时候,可以看到控制台中打印了三个事件:

image.png

当 “光标离开的时候” 又打印了一个事件:

image.png

当再次输入只会触发两个事件:
image.png

共同点:都是两个属性,第一个取决于事件类型,并包含控件值或的控件的状态值,第二个source。它指向发出事件的对象。

  • PristineChangeEvent - 在首次更改控件值时触发,无论控件是否具有初始值。
  • ValueChangeEvent - 类似于 (老式;))valueChange事件。它提供控件的当前值。默认情况下,每当控件的值发生更改时,都会触发它。
  • StatusChangeEvent - 类似于statusChanges.它提供当前的验证状态。每次更改控件的值时都会触发,无论控件是否分配了验证器。如果控件分配了异步验证程序,则StatusChangeEvent将发出两次。一次,当 status 属性设置为PENDING,则当验证器返回验证结果时,将第二次返回验证结果。
  • TouchedChangeEvent - 当用户首次与控件交互时触发。通常,当用户模糊控件时,即使该值没有更改,也会触发它。

等后续用到该功能时,在详细出一篇关于event使用。

input

在15版本中,当我们子组件需要传值的的时候:通常使用的是@Input属性来实现:
value类型是一个 number

image.png
使用:

//子组件定义
@Input() value = 0;

// 子组件显示值
<p>input {{value}}</p>

//父组件中引入子组件进行传值
<app-input [value]=100></app-input>

在19版本中可以这样使用:

image.png

在源码中可以看到:InputSignal是范型,我们可以随意指定类型。默认值是undefined。

image.png

使用:

//子组件定义
value = input<number>();

// 子组件显示值
<p>input {{value()}}</p>

// 父组件中引入子组件进行传值
<app-input [value]=100></app-input>

value是一个InputSignal,可以通过调用 signal 来读取该值

ngOnInit(): void {
    this.label();
  }
// 创建computed 读取值,返回的是Signal
label = computed(() => {
        console.log('读取', this.value())
    });

还可以设置,必需输入:required

  value = input.required<number>();

父组件必须给子组件值,不然会报错:

image.png

当然,还有更多功能:

  • Input transforms:输入转换
  • Type checking: 类型检查
  • Input aliases: 设置别名
  • Model inputs:模型输入

上面只是冰山一角,期待你的发现。

更多更详细的使用,请参考:https://next.angular.dev/guide/components/inputs

Output

当需要给父组件弹值的时候,在15中我们通常这么使用:

@Output() panelClosed = new EventEmitter<void>();

在18、19中我们可以像input一样 这么使用,并且官方也推荐我们这么使用:

image.png

output function 完全支持@Output API

panelClosed = output<void>();

从源码中可以看到返回的是:OutputEmitterRef,也可以声明类型。

image.png

打包目录也有所该变

好像在 angular17开始Vite 和 esbuild 来取代以前的 webpack 进行打包了。

当你需要部署你的项目时候,请注意打包后的结构目录也有所不用。

图下是15打包的结构目录:
image.png

图下是18打包后的结构目录:
image.png

从图中可以看到单独拿出来了3rdpartylicenses.txt,并且打包后的文件都放在了browser文件夹下。猜测为了更好的支持浏览器兼容性吧。

图下是19打包后的结构目录:相比18,多了prerendered-routes.json这个文件,不知道具体作用,看文件名猜测用来存储已渲染的路由列表吧。

image.png

友情链接

这篇是angular工作人员接受了关于19的一些更改 Meet Angular v19Angular v18 is now available!
官方文档

下面是我们团队学习angular19和18的一些理解:
手把手带你初始化一个angular库
angular 19 学习记录
Angular Signal的简单学习
angular 新语法糖学习一


zZ_jie
431 声望9 粉丝

虚心接受问题,砥砺前行。