Angular 从输入文本中使用(keyup.enter)显示模式时,抛出错误:expressionChangedTerrithasBeenCheckedError

Angular 从输入文本中使用(keyup.enter)显示模式时,抛出错误:expressionChangedTerrithasBeenCheckedError,angular,bootstrap-4,ng-bootstrap,Angular,Bootstrap 4,Ng Bootstrap,im将可视代码与angular 4和bootstrap 4(v4.alpha,ng bootstrap)结合使用 当您键入一些数字并按enter键而不失去焦点(显示模式)时,问题就会发生。显示模式为“模式”,但在控制台中显示所提到的错误。(错误:expressionChangedTerithasBeenCheckedError)并指出错误来自输入文本: <div class="form-group" [ngClass]="{'has-error': (numer

im将可视代码与angular 4和bootstrap 4(v4.alpha,ng bootstrap)结合使用

当您键入一些数字并按enter键而不失去焦点(显示模式)时,问题就会发生。显示模式为“模式”,但在控制台中显示所提到的错误。(错误:expressionChangedTerithasBeenCheckedError)并指出错误来自输入文本:

    <div class="form-group" 
         [ngClass]="{'has-error': (numeroDocuVar.touched
         ||numeroDocuVar.dirty) && !numeroDocuVar.valid }">
       <div class="form-group">
            <div class="input-group">
                 <input class="form-control" id="numeroDocuId" 
                        type="text" placeholder="Numero documento (requerido)" 
                        [(ngModel)]="IdNumeroDocu" name="numeroDocu"                                                                 
                        #numeroDocuVar="ngModel" 
                     (keyup.enter)="onSearchDocumento(numeroDocuVar.value)"
                        required />
                 <span class="input-group-addon fa fa-search" 
                       (click)="onSearchDocumento(numeroDocuVar.value)" 
                        style="cursor:pointer">
                 </span>
            </div>
     </div>
</div>

我已经读到,我可以使用ngAfterContentInit来完成,但是这个变量不是由计算填充的,而是由用户在输入文本中填充信息

我使用ng引导模式代码


非常感谢您的帮助。

此错误不会显示在生产版本中。。。所以,如果情况变得更糟,你可以忽略它。但是,它可能发生在许多不同的情况下,通过用户输入更改状态/视图肯定是常见的

首先要做的是确保您使用的是默认的changeDetection模式,而不是“OnPush”模式。如果它是你自己构建的应用程序,并且你没有在任何地方更改这些设置,那么你使用的是默认的更改检测模式,所以你很好

您可以将输入包装在NgForm元素中,并在调用onSearchDocumento方法的组件代码中放置submit方法,而不是在模板中手动绑定到keyup事件。这可能会防止出现错误,并且可能会使模板稍微干净一些

 <form #formName="ngForm" (ngSubmit)="onSearchDocumento(formName)">
    ... input and other elements ...
 </form> 
如果这不起作用,您可能必须导入ChangeDetectorRef并强制它在继续其他方法之前使用其detectChanges()方法检查更改。差不多-

import { ChangeDetectorRef ... your other imports.... } from '@angular/core'
在您的组件中:

constructor( private cdr: ChangeDetectorRef) { ...
然后在搜索方法中添加对detectChanges的调用:

onSearchDocumento( ... ) { 
    this.cdr.detectChanges();
    // rest of method // 
}
我也有同样的问题。 为了解决这个问题,你应该在调用模式窗口之前移除焦点

constructor(private modalService: NgbModal, private elRef: ElementRef, private renderer: Renderer) {}    
this.renderer.invokeElementMethod(this.elRef.nativeElement.ownerDocument.activeElement, 'blur'); // put this line before you call your modal in the component
this.modalRef = this.modalService.open(this.modalNotification);
或者你应该检查你的输入,比如在ngOnInit上触摸


您可以阅读有关此问题的信息。

我也有类似的问题。我的解决方案是在打开模式之前手动模糊输入:

<input 
  ...
  (keyup.enter)="onSearchDocumento($event, numeroDocuVar.value)" 
/>
onSearchDocumento(event, val){
  event.target.blur();
  // ... rest of the method 
}

嗨,透辉石!!谢谢你的回答,我已经尝试了你提到的一切,但是错误仍然出现!!如果你有别的想法,我会很感激的。
onSearchDocumento(event, val){
  event.target.blur();
  // ... rest of the method 
}