Angular 2 模态弹出错误“表达式在检查后已更改”

2024-07-04

演示应用程序的 Github 存储库 https://github.com/eddy80310/formBug

我有一个非常简单的应用程序,其中包含应用程序组件、子组件(帐户)、处理消息对话框组件(弹出模式)的警报服务。

为了演示目的,我有两种相同的表单,一种位于 app.component.ts 内,另一种位于 account.component.ts 内。它们每个都有一个按钮,用于调用警报服务以显示消息对话框模式。

问题是,当我单击子组件 (account.component.ts) 表单的输入字段并“按键盘上的 Enter”时,出现此错误

异常: ./AccountComponent 类 AccountComponent - 内联模板:2:2 中出现错误,原因是:表达式在检查后已更改。先前值:“true”。当前值:“假”。 请注意,在下面提到的任何其他情况下都不会发生此错误

  1. 如果我单击按钮而不是按键盘上的 Enter 键

  2. 即使我按 Enter 键,app.component.ts 中的表单似乎也没有任何问题。它似乎只是子组件(account.component.ts)。

  3. 如果我单击 account.component 的输入,输入一些内容,单击按钮,不显示错误,删除输入,按 Enter 键,与之前相比,现在不显示错误

我调查了 SO 和 google,似乎人们也遇到了同样的问题,并通过调用更改检测来解决它。但是,我已经尝试过并将其放在诸如模式显示之后之类的位置,但它不起作用。另外,如果这可以解决问题,那么它并不能解释为什么 app.component.ts 中的表单不会导致我出现此错误。

下面是一些代码片段,完整的演示项目可以在上面的 github 链接上找到。这个问题困扰了我好几天了。非常感谢您的帮助。

应用程序组件.html

<label>This form is from app.component.html</label>
<form name="form" [formGroup]="changePasswordForm" (ngSubmit)="onUpdatePassword()">
    <input placeholder="Old Password" formControlName="oldPassword">
    <button class="btn btn-success">Update Password</button>
</form>

<br><br><br><br>

<label>This form is from account.component.html</label>
<router-outlet> </router-outlet>

<template ngbModalContainer></template>

应用程序组件.ts

export class AppComponent implements OnInit {

    private changePasswordForm: FormGroup;

    constructor(
      private formBuilder: FormBuilder,
      private alertService: AlertService,
    ) { }

    ngOnInit() {
      this.changePasswordForm = this.formBuilder.group({
        oldPassword: [''],
      })
    }

    onUpdatePassword() {
      this.alertService.alertPopup('test2', 'asfafa')
    }
}

account.component.html

<form name="form" [formGroup]="changePasswordForm" (ngSubmit)="onUpdatePassword()">
  <input placeholder="Old Password" formControlName="oldPassword">
  <button class="btn btn-success">Update Password</button>
</form>

帐户.组件.ts

导出类 AccountComponent 实现 OnInit {

  private changePasswordForm: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private alertService: AlertService,
  ) { }

  ngOnInit() {
    this.changePasswordForm = this.formBuilder.group({
      oldPassword: [''],
    })
  }

  onUpdatePassword() {
    this.alertService.alertPopup('test2', 'asfafa')
  }
}

警报服务.ts

@Injectable()
export class AlertService {
    private subject = new Subject<any>();
    private keepAfterNavigationChange = false;

    constructor(
        private router: Router,
        private modalService: NgbModal,
    ) { }


    alertPopup(title: string, content: string) {
        // open modal to check if worked over night
        const modalRef = this.modalService.open(MessageDialogComponent);

        modalRef.componentInstance.titleText = title
        modalRef.componentInstance.bodyText = content

        modalRef.result
            .then(response => {
            })
            .catch(() => {
                return
            })
    }
}

消息对话框.component.html

<div class="modal-header">
  <h4 class="modal-title">{{titleText}}</h4>
</div>

<div class="modal-body">
  <p>{{bodyText}}</p>
</div>

消息对话框.component.ts

export class MessageDialogComponent implements OnInit {

  @Input() titleText: string;
  @Input() bodyText: string;

  constructor(
    public activeModal: NgbActiveModal,
  ) { }

  ngOnInit() {
  }

}

执行以下代码后似乎出现错误:

ngAfterViewInit() {
    if (!this._elRef.nativeElement.contains(document.activeElement)) {
      this._renderer.invokeElementMethod(this._elRef.nativeElement, 'focus', []);
    }
}

https://github.com/ng-bootstrap/ng-bootstrap/blob/1.0.0-alpha.20/src/modal/modal-window.ts#L65 https://github.com/ng-bootstrap/ng-bootstrap/blob/1.0.0-alpha.20/src/modal/modal-window.ts#L65

on input被解雇blur将您的控件标记为的事件touched.

它不适合AccountComponent因为检测变化AccountComponent发生在之前ngbModalContainer while FormGroup within app.component.html获得正确的价值观。

可能的解决方案:

1)在打开模态之前将您的控件标记为触摸

帐户.组件.ts

onUpdatePassword() {
  Object.keys(this.changePasswordForm.controls).forEach(key => {
     this.changePasswordForm.controls[key].markAsTouched();
  });

  this.alertService.alertPopup('test2', 'asfafa')
}

2)更改订单标签

应用程序组件.html

<template ngbModalContainer></template>
<router-outlet> </router-outlet>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 模态弹出错误“表达式在检查后已更改” 的相关文章

随机推荐

  • 除了Azure Portal之外,还有查看Application Insights日志的方法吗?

    我无法忍受在 Azure 门户中多次单击来访问 AppInsights 日志分析 将 URL 保存到分析刀片并返回到它也经常无法加载页面 因为似乎存在一些身份验证令牌过期问题 如何在不使用 Azure 门户的情况下在 AppInsights
  • Eslint:无重复解决错误:无法加载解析器“节点”

    我今天刚刚更新了我的项目 带有 VueJS 和 Quasar Framework 的 SPA npm update我现在无法运行它 我收到错误no duplicates Resolve error unable to load resolv
  • Android SKIA 图像解码

    HI 我目前正在研究Android如何解码和图像文件 当我检查代码时 它似乎正在调用 SKIA 库 但是 我如何根据源代码知道android skia支持哪些图像文件格式呢 我不是编程专家 所以我仍在尝试了解C 和Java语言 我现在迷失在
  • MVC_layout页面中脚本放置的位置

    您好 通过阅读本网站上的建议 我了解到脚本应位于 layout 页面的底部 我的问题是我不确定 底部 到底在哪里 有些人说它就在标签之前 但这对我不起作用 我尝试过将脚本放在很多地方 但似乎没有地方起作用 有人可以告诉我我做错了什么吗 这是
  • Decimal 存储 C# 中解析字符串的精度?有什么影响?

    在 IRC 的一次对话中 有人指出了以下几点 decimal Parse 1 0000 ToString 1 0000 decimal Parse 1 00 ToString 1 00 如何 为什么decimal类型像这样保留精度 或者更确
  • 复合主键:好还是坏?

    虽然可以使用复合主键 但是对于下面的情况 这真的是一种不好的做法吗 Stackoverflow 上的共识在这个问题上似乎是双向的 Why 我想将订单付款存储在单独的表中 原因是 一个订单可以有许多项目 这些项目以多对多关系的形式在单独的表中
  • 在 C 中打印 Unicode 符号

    我正在尝试打印 unicode 星号字符 0x2605 http www fileformat info info unicode char 2605 index htm 在使用 C 的 Linux 终端中 我遵循了网站上其他答案建议的语法
  • 如何获取谷歌地图 v2 api 密钥以进行团队合作

    抱歉我的英语不好 我的 google 地图 api v2 密钥有问题 我和我的团队一起工作 我们的项目 android 项目 只需要一个 api 密钥 有可能吗 或者我团队的所有成员都必须生成 api 密钥才能运行 google 地图 您可
  • 无法在 python 中获取当前 url

    我创建了一个类和方法 如下所示 我需要获取当前页面的网址 但在调用 get full path 时出现错误 class A object def get user request current url request get full p
  • python statsmodels:帮助使用 ARIMA 模型进行时间序列

    statsmodels 的 ARIMA 为我的输出提供了不准确的答案 我想知道是否有人可以帮助我理解我的代码有什么问题 这是一个示例 import pandas as pd import numpy as np import datetim
  • 在 git Push 上硬重置

    我有一个接收后挂钩脚本位于我正在推送的远程存储库上 该脚本执行以下操作git reset hard 像这样的东西 git push opal Counting objects 74 done Delta compression using
  • Haskell 约束不小于实例头

    有些戒指可以配备标准功能 class Ring C a gt EuclideanDomain a where norm a gt Integer 使用此功能 可以通过明显的方式订购戒指 compare x y compare norm x
  • 从 Equals 方法返回 false 而不覆盖

    Write TestEquals class所以主要方法Puzzle3班级版画false 注意 您不能覆盖 TestEquals 类的 equals 方法 public class Puzzle3 public static void ma
  • Haskell:如何评估“1+2”等字符串

    实际上我有一些公式 x y 这是一个String 我设法更换了x y具有特定值的变量 例如 1 2 这仍然是String类型 现在我的表情就像 1 2 所以问题是如何计算字符串类型的表达式并得到结果 PS 我想要某样东西read 可以直接转
  • Android 生物识别回调不适用于 PIN-CODE

    我正在尝试使用指纹和 Pincode 来实现生物识别 指纹工作正常 但是当我尝试使用 pin 码时 会出现带有 pin 码的屏幕 但如果我调用 pin 码检查 则不会调用回调没有指纹 只调用 onAuthenticationSucceede
  • 在SSIS中使用脚本任务导入Json文件

    我是在 SSIS 中使用脚本任务导入 API 的新手 我必须管理一个简单的 API JSON 文件的导入 但这第二个 API JSON 文件有点棘手 我一直在看代码 只是不知道我做错了什么 我的 JSON 文件有一个标头 我需要确定需要循环
  • Firebase 分析在 DebugView 中显示不正确的数据

    我正在使用 Firebase 分析 我注册了两个用户属性 并且有两个自定义事件 每个事件包含 3 到 50 个不同的选项 我遇到的问题是 当我设置用户属性时 DebugView 通常会显示事件的旧用户属性或根本不显示 有时它可以正常工作 请
  • urllib.error.HTTPError:HTTP 错误 502:错误网关 PYTHON

    我尝试使用 urllib request urlopen url read 打开 Instagram URL 但收到错误urllib error HTTPError HTTP 错误 502 错误网关 username input enter
  • Angular 5 - 如何重定向到具有特定标头的外部 URL?

    这就是我试图用 Angular 实现的目标 this headers this http get urlApi subscribe data gt go to url with specific headers err gt console
  • Angular 2 模态弹出错误“表达式在检查后已更改”

    演示应用程序的 Github 存储库 https github com eddy80310 formBug 我有一个非常简单的应用程序 其中包含应用程序组件 子组件 帐户 处理消息对话框组件 弹出模式 的警报服务 为了演示目的 我有两种相同