混淆为 [(ngModel)] 不属于 Angular4 中的任何指令类别

Confused as [(ngModel)] doesn't fall in any of the Directive Categories in Angular4

根据 Angular 文档,Angular 的指令有 3 种类型:

根据以下官方link:https://angular.io/guide/attribute-directives#directives-overview

1.组件

<home></home>
<about-us></about-us>
<support></support>

2。结构指令

<div *ngIf="age < 18"> ... </div>
<div *ngFor="let x of students"> ... </div>

3。属性指令

<div [ngClass]="red"> ... </div>
<div [ngStyle]="{'background':colorValue}> ... </div> 

现在,我的问题是 [(ngModel)] 是一个指令,但我很困惑,因为它似乎不属于上述 3 个类别中的任何一个(根据官方文档),并且没有第四类!那么,有人可以指出 [(ngModel)] 是什么样的指令吗?

[(ngModel)] 是 Angular 使用的 'convenience' 指令,通过组合属性指令和事件侦听器来简化双向绑定。它实际上并不属于您提到的任何指令组,但它也不属于自己的组。

使用 @Directive Decorator,您还可以创建自己的指令,Angular 文档提供的类型可能旨在简化进入 Angular(.. 或您的情况可能会造成混淆 ;-) )

[(NgModel)] 是与事件侦听器结合的属性指令。此 [(NgModel)] 是 shorthand 的:

[ngModel]="variable" (ngModelChange)="variable = $event"。如您所见,它在幕后隐藏了类似于 EventEmitter 的东西。因此它将 variable 绑定到模板,并同时监听模板和模型中的更改事件。

NgModel 是一个 属性指令 。它作为属性应用于(几乎)您的 DOM.

中的任何元素

NgModeldoc 显示其选择器是 [ngModel]...,这意味着它作为属性应用于(几乎)您 DOM 中的任何元素。

您链接的官方文章总结了三类:

Components — directives with a template.

Structural directives — change the DOM layout by adding and removing DOM elements.

Attribute directives — change the appearance or behavior of an element, component, or another directive.

当您将 [(ngModel)] 放在一个元素上时,您就是通过将输入和输出与其相关联来修改其行为(请参阅@JensHabegger 的回答)。 “盒子里的香蕉”是双向绑定的语法糖,详细说明here。本质上,您是将 [ngModel] 与输入一起应用,然后根据其输出自动修改值。

因此,NgModel 绝对是一个属性指令。