[ngModel] 和 (ngModelChange) 如何协同工作?

Vij*_*jay 7 typescript angular

我是 angular 的新手,我正在学习 Angular 6。我了解 ngModel。但是当我尝试使用 ngModelChange 时,提出了一些问题。

我有一个 html 元素 HTML

<input #input  type="text" [value]="name" [(ngModel)] ="name" (ngModelChange) ="change(input.value)"/>
Run Code Online (Sandbox Code Playgroud)

打字稿

change(event :any) {
    this.name = event;
    console.log(this.name);
}
Run Code Online (Sandbox Code Playgroud)

更改 input 中的值后,我可以看到 name 属性的更改。

当我将 html 代码更改为

HTML

<input #input type="text" [value]="name"  [ngModel] ="name" 
(ngModelChange)="change(input.value)" />
{{ name }}
Run Code Online (Sandbox Code Playgroud)

TS

change(event :any) {
    this.name = event;
    console.log(this.name);
}
Run Code Online (Sandbox Code Playgroud)

它在控制台和 UI 中按预期工作正常。

问题 1

<input #input  type="text" [value]="name" [(ngModel)] ="name" 
(ngModelChange) ="change(input.value)"/>
Run Code Online (Sandbox Code Playgroud)

&

<input #input type="text" [value]="name"  [ngModel] ="name" 
(ngModelChange)="change(input.value)" />
Run Code Online (Sandbox Code Playgroud)

一样吗??

问题2。

当我删除 [ngModel] 指令时。ngModelChange 没有被触发。必须拥有 [ngModel] 吗?如果是,为什么?

HTML

<input #input type="text" [value]="name" 
(ngModelChange)="change(input.value)" />
<br/>
<br/>
{{ name }}
Run Code Online (Sandbox Code Playgroud)

TS

change(event: any) {
     this.name = event;
     console.log(this.name);
 }
Run Code Online (Sandbox Code Playgroud)

这将是一个很大的帮助。提前致谢。

Chr*_*isY 7

ad问题1) 它们与你写的不一样。写作

<input [(ngModel)]="name" (ngModelChange)="change(input.value)"/>
Run Code Online (Sandbox Code Playgroud)

如果您只想设置变量值,那么实际上没有意义,因为 (banana-in-a-box) 表达式[(ngModel)]本身只是语法糖

[ngModel]="name" (ngModelChange)="name = $event"

所以你的例子会导致:

<input [ngModel]="name" (ngModelChange)="name = $event" (ngModelChange)="change(input.value)"/>
Run Code Online (Sandbox Code Playgroud)

ad 问题 2) 是的,您至少需要[ngModel]="name"表达式才能激活 Angular 指令。我们可以在Angular 源代码本身的 NgModel 指令的选择器中看到:

@Directive({
  selector: '[ngModel]:not([formControlName]):not([formControl])',
  providers: [formControlBinding],
  exportAs: 'ngModel'
})
export class NgModel extends NgControl implements OnChanges,
    OnDestroy {
    ...
    ...
    @Output('ngModelChange') update = new EventEmitter();
    ...
Run Code Online (Sandbox Code Playgroud)


Hsu*_*Lee 6

当元素具有名为 x 的可设置属性和名为 xChange 的相应事件时,[()] 语法很容易演示。这是一个适合这种模式的 SizerComponent。它有一个 size value 属性和一个伴随的 sizeChange 事件

https://angular.io/guide/template-syntax#basics-of-two-way-binding

所以,它们是等价的。

<input [(ngModel)]="name"/>
<input [ngModel]="name" (ngModelChange) ="name = $event"/>
Run Code Online (Sandbox Code Playgroud)

但是如果没有对应的属性,那么xChange就行不通了。

<input (ngModelChange) ="name = $event"/>
Run Code Online (Sandbox Code Playgroud)