我的项目有一个页面来 Select 一个计划.在我将BrowserAnimationsModule添加到我的项目之前,它工作得很好.

该页面上有一个按钮"Change to Program A".无论您点击此按钮多少次,它都会正常工作.

请参阅correct program selector

但在此项目中添加BrowserAnimationsModule后,第二次点击时设置为"空程序".但数据模型已经设置为正确的程序,这是我打印在页面上的.

请参阅broken program selector

该页面本身没有使用BrowserAnimationsModule.这两个链接上的代码完全相同,只是其中一个链接在项目中有BrowserAnimationsModule.

我试过 firefox 和Edge,都有同样的问题.

我也试过Angular 12和15版本,都有同样的问题.

当前实现使用的是FormControl.我也try 了[(NgModel)],也遇到了同样的问题.

这两个链接都有源代码映射,可以在源代码上进行调试. 请使用浏览器控制台查看它们.

我在BrowserAnimationsModule上看到有人提到a bug.但看起来它已经修好了.

你可以完全控制这个小项目on stackblitz

推荐答案

为什么?

您正在更新allProgramList,这会导致Angular 渲染引擎将更改应用于ngFor个差异.它发现数组已更改,并try 重新呈现它.首先,它从DOM中删除项,然后一个接一个地添加新项(由于错过了trackBy选项).

不同之处在于呼叫renderer.removeChild:

当使用BrowserAnimationsModule时,它使用BaseAnimationRenderer,它只标记要在转换后删除的项.

您可以在浏览器smth中看到如下内容:

enter image description here

默认情况下,Angular 使用DefaultDomRenderer2表示立即移除项目.

删除后,ANGLE会在<option>个标记中的每个标记上插入新 node 并注册内置的NgSelectOption指令,该指令也会基于_optionMap(由[ngValue]提供)更新<select>值,或者在没有提供_optionMap的情况下更新-1.

因此,这些操作结果会导致<select>个html元素的最终值错误.

解决方案

您可以try 以下选项之一来修复它:

  • 使用trackBy

html个个

*ngFor="let p of allProgramList; trackBy: trackByFn" 

ts

trackByFn(i, x) {
    return x.pId;
}
  • option标签上使用ngValue而不是value属性绑定

html个个

[ngValue]="p.pId.toString()"

Angular相关问答推荐

停靠的Angular 应用程序的Nginx反向代理无法加载assets资源

为什么我的自定义.d.ts不起作用?LeaderLine不是构造函数

独立Angular 零部件不在辅零部件或共享零部件中工作

确保我的角库S服务构建提供独立的友好提供功能

Angular 应用程序未在Azure应用程序服务中运行

正确理解 angular14 中的注入 - 必须从注入上下文中调用注入()

我应该在 Jasmine 3 中使用什么来代替 fit 和 fdescribe?

Angular2 Material Dialog css,对话框大小

如何在 Angular 2 应用程序中配置不同的开发环境

Angular2 Pipes:输出原始 HTML

Angular-CLI 代理到后端不起作用

Angular 2 setinterval() 继续在其他组件上运行

Angular 5 中 value 和 ngValue 的区别

默认情况下如何在Angular中 Select mat-button-toggle

Angular 2 更改事件 - 模型更改

Angular2中是否有像window.onbeforeunload这样的生命周期钩子?

Angular 2 单元测试 - 出现错误无法加载ng:///DynamicTestModule/module.ngfactory.js

在 Angular 2 中使用逗号作为列表分隔符

如何在 Angular 5 react式表单输入中使用管道

如何在 Angular CLI 的构建时插入内部版本号或时间戳