5

最小的 Stackblitz 示例

https://stackblitz.com/edit/angular-mqqvz1

在 Angular 7 应用程序中,我创建了一个带有<input>字段的简单组件。

当我用键盘更改输入值时,我希望将值格式化为onBlur。- 在最小的例子中,我只想向它添加字符串“EDIT”

这基本上是有效的:

  • 如果我输入“test”并模糊该字段,它将更改为“test EDIT”
  • 如果我输入“lala”并模糊该字段,它将更改为“lala EDIT”

但是 ,当我输入“测试”-模糊(它有效)并再次输入“测试”时,它不再有效!

-functiononInputUpdate()被调用(你可以在控制台日志中看到它),变量inputValue被更新(你可以在组件中看到它{{inputValue}}),但是输入值没有改变! 我希望它是“测试编辑”,但它仍然是“测试”。

当我输入另一个字符串时它可以工作,但是连续输入相同的字符串 2 次不起作用。这是为什么?我怎样才能解决这个问题?

组件.html

{{inputValue}} <br />
<input type="text"
       [ngModel]="inputValue"
       (ngModelChange)="onInputUpdate($event)"
       [ngModelOptions]="{ updateOn: 'blur' }"/>

组件.ts

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {

  inputValue = "teststring";

  constructor(
    private changeDetectorRef: ChangeDetectorRef,
  ) {}

  public ngOnInit() {
    this.inputValue = "initial";
  }

  public onInputUpdate(inputValue: string) {
    this.inputValue = inputValue + ' EDIT';
    this.changeDetectorRef.markForCheck();
    console.log('onInputUpdate new inputValue', this.inputValue)
  }
}
4

1 回答 1

5

To make sure that the input field is updated after typing the same value again, force the view to update first with the raw text by calling ChangeDetectorRef.detectChanges:

public onInputUpdate(inputValue: string) {
  this.inputValue = inputValue;            // Set value to raw input text
  this.changeDetectorRef.detectChanges();  // Trigger change detection
  this.inputValue = inputValue + ' EDIT';
  this.changeDetectorRef.markForCheck();
}

See this stackblitz for a demo.

于 2019-01-07T22:20:24.393 回答