ngModelChange 如何在不在 ngModel 指令中提供模型名称的情况下工作

How does ngModelChange works without providing model name in ngModel directive

ngModelChange() 是如何工作的?

但我不确定,(ngModelChange) 它是如何工作的,如果我使用 ngModelChange() 事件,即使我不是

<input #gb type="text" pInputText class="ui-widget ui-text" **ngModel**  
 (ngModelChange)="functionName($event)">

Source codengModelChange只是一个事件发射器。

  @Output('ngModelChange') update = new EventEmitter();

它在执行 viewToModelUpdate 函数时触发。

viewToModelUpdate(newValue: any): void {
  this.viewModel = newValue;
  this.update.emit(newValue);
}

ngModel 可以是任何东西,并且没有直接 link 指向任何其他东西。在代码中它被声明并且它只在一个名为 ngOnChanges

的函数中使用
@Input('ngModel') model: any;

ngOnChanges(changes: SimpleChanges) {
  this._checkForErrors();
  if (!this._registered) this._setUpControl();
  if ('isDisabled' in changes) {
    this._updateDisabled(changes);
  }

  if (isPropertyUpdated(changes, this.viewModel)) {
    this._updateValue(this.model);
    this.viewModel = this.model;
  }
}

我在这里可能是错的,但在我看来 ngModel 不是唯一的事实来源,但 this.viewModel 似乎是,因此 ngModel 不需要ngModelChange 的值与 ngModel 值分开工作。


希望对您有所帮助。

你在没有 ngModel 的情况下试试

<select (change)="changed($event)">
     <option *ngFor="let data of allData" [value]="data.id">
           {{data.name}}
       </option>
</select>

changed(e){
   //event comes as parameter and then find data manually
   //by using e.target.data

}

              OR BY ID

 <inputtype="text" #byid (change)="onChange(byid.value)" />
  onChange(title:string){
   alert(title);
   }

您可以尝试将 id 传递到输入

是的,ngModelChange() 在不向 ngModel 提供模型名称的情况下工作。

发生这种情况的原因,(ngModelChange) 是 ngModel 指令的 @Output。 当在输入中插入一些值时,emitEvent 变为 true,默认情况下为 false(因此它不会在初始时间触发页面加载)。

_this.updateValueAndValidity({ emitEvent: false });

您可以在 \@angular\forms\esm5\forms.js ► 行号 3850

找到

如果emitEventtrue,这 更改将导致 FormControl 上的 valueChanges 事件被发出。这默认 为真(因为它下降到 updateValueAndValidity)。

如果 emitViewToModelChangetrue,将触发 ngModelChange 事件以更新 模型。如果未指定 emitViewToModelChange,则这是默认行为。

如果emitModelToViewChangetrue,视图将被通知新值 通过 onChange 事件。

现在的问题是,为什么在插入输入而不是 ture 的 $event 中得到相同的值,导致

FormControl.prototype.setValue = /**

function (value, options) {
        var _this = this;
        if (options === void 0) { options = {}; }
        (/** @type {?} */ (this)).value = this._pendingValue = value;
        if (this._onChange.length && options.emitModelToViewChange !== false) {
            this._onChange.forEach(function (changeFn) { return changeFn(_this.value, options.emitViewToModelChange !== false); });
        }
        this.updateValueAndValidity(options);
    };

同一文件行号 3911 到 3919