【发布时间】:2019-06-07 18:09:04
【问题描述】:
我正在使用 *ngFor 显示消息列表,并希望将 css 类应用于添加到集合中的项目在列表最初呈现之后。
即我不想在视图最初加载时应用该类,但仅在 messages 集合获得新项目时应用。
这个集合的来源是一个可以随时改变的服务的 observable。
<div *ngFor="let message of thread.messages">
<div [class.fade-in-text]="threadWasLoaded">
{{ message.text }}
</div>
</div>
我以为我知道线程已加载后我会设置一个变量,但这没有奏效。我尝试在基本上每个 Angular 生命周期钩子中订阅 observable。
结果要么始终将 css 类应用于所有列表项,要么出现以下错误:
错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。
this.thread$ =
this.storeQuery.getThreadWithMessages(this.threadId)
.pipe(
map(t => this.thread = new Thread(t)),
tap(t => this.threadWasLoaded = true)
);
我可能完全问错了问题。请让我知道我的整体方法是否偏离了基础。 :-)
编辑: 我从This Article 找到了解决我的问题的方法,它通过在页面加载时抑制子动画以不同的方式解决这个问题。
【问题讨论】:
-
您能否以良好的方式访问初始数据?在初始对象上映射一个真正的布尔值怎么样 - 当它没有添加到稍后出现的对象时,该属性将是未定义的。然后你可以使用 ngClass ????为避免表达式错误,请使用 ngIf 删除 div 直到设置初始数据。
-
直接修改 DOM 几乎总是离谱。 Angular 的目的是为你修改 DOM。我建议向您的对象添加一个属性,以便您可以通过 Angular 应用该类。如果您正在尝试这样做,您也可以查看动画。
-
感谢大家的建议。我现在有时间回到这个话题。 @LarsRødal - 我确实可以访问初始数据,所以我尝试将属性应用于对象。问题是,为了设置正确的值(真或假),我需要知道该项目是否已经在 DOM 中呈现,我无法确定。
-
@theMayer - 我不打算直接操纵 dom。将属性应用于原始项目会很棒,我只是还没有弄清楚如何确定项目是否已被渲染到 DOM 尚未设置适当的值。
-
项目在lifecycle的某个阶段渲染到DOM -