Хитрость для принудительного обновления представления, даже когда конечное значение совпадает с существующим, состоит в том, чтобы сначала вызвать ChangeDetectorRef.detectChanges()
после установки необработанного (и, возможно, недействительного) значения, а затем установить правильное значение.
Например, если у вас было текстовое поле, которое принимает только цифры, и если обработка выполнялась в коде компонента, вы могли бы реализовать установщик следующим образом:
private _numericString: string;
get numericString() {
return this._numericString;
}
set numericString(value) {
this._numericString = value; // <------------------------ Set the raw value
this.changeDetectorRef.detectChanges(); // <--------------- Trigger change detection
this._numericString = value.replace(/[^\d]/gi, ""); // <----- Set the corrected value
}
См. это стекаблиц для демонстрации.
В вашем фактическом коде config.Rendition
определяется как свойство getter / setter в отдельном классе, а форматирование выполняется как в get
, так и set
, что затрудняет принудительное обнаружение изменений с помощью rawзначение.Один из способов обойти эту трудность - определить свойство configRendition
getter / setter в компоненте и присвоить это свойство ngModel
:
<input #amount type="text" placeholder="xxx" [(ngModel)]="configRendition">
Затем мы можем реализовать configRendition
таким способомчто ChangeDetectorRef.detectChanges()
вызывается сначала с необработанным значением, прежде чем на самом деле установить config.Rendition
:
private rawRendition: string;
get configRendition() {
if (this.rawRendition) {
return this.rawRendition;
} else {
return this.config ? this.config.rendition : null;
}
}
set configRendition(value) {
this.rawRendition = value;
this.detector.detectChanges();
if (this.config) {
this.config.rendition = value;
}
this.rawRendition = null;
}
См. этот стек для демонстрации.