【问题标题】:Angular - Prevent Element color blink on template renderingAngular - 防止模板渲染时元素颜色闪烁
【发布时间】:2018-05-20 10:06:34
【问题描述】:

在我的 Angular 6 应用程序中,我有一个按钮应该保持禁用状态,直到用户选择表格中的一行。

当我浏览到组件时,有一个小的闪烁效果,按钮从启用(红色)闪烁到禁用。

您可以在此处查看(左下角的删除按钮): https://www.useloom.com/share/b165c30f8912420182d02791066ec9f4

我处理它的方式非常简单。我有一个数组,它计算所选行数。如果此数组的长度为 0,则应禁用该按钮:

<button mat-fab color="warn" [ngClass]="{'button-follow-1': true}" (click)="onDeleteTask()" [disabled]="selectedTasks.length == 0" matTooltip="Delete">
  <mat-icon class="mat-36" aria-label="Delete Task" >delete</mat-icon>
</button>

在组件 Typescript 中,我在 NgOnInit 中将数组长度设置为 0,但闪烁效果仍然存在。

我也尝试过将数组长度属性包装在 SetTimeout 1ms 函数中,并使用 *NgIf 有条件地显示按钮,但它在视觉上并不优雅。

有没有更好的解决方案?

谢谢

【问题讨论】:

  • 你能在 StackBlitz 中创建一个minimal reproducible example 吗?我想会更容易帮助,谢谢
  • 请拜托......
  • ngOninit 最好。
  • 我已经将数组长度设置为0 怎么样?长度是只读的;]

标签: angular


【解决方案1】:

selectedTasks.length == 0 更改为selectedTasks.length === 0

在组件中用空数组初始化你的数组。 Dony,您在控制台中有一些异常吗?

selectedTasks.length 有可能解析为undefinednull,如果与== 0 相比,这将导致true

Stacblitz 编辑:

由于您已附加 Stackblitz(非常好!) Iv 修改了您的代码 - 没有闪烁效果。

问题是,您必须最初将按钮设置为禁用。这不是比较问题 - 设置 [disabled]='true' 具有相同的效果。

https://stackblitz.com/edit/angular-ork7az?file=src/app/app.component.html

我做了什么:我在按钮上添加了disabled,所以它最初是禁用的。所以基本上他们的解决方案就像我在我删除的答案中指出的那样有人投反对票:)

但公平地说,对我来说,它看起来像是 Angular Material 中的错误。也许你可以在 github 上提出问题。

【讨论】:

  • 感谢您的所有回答。 Stackblitz 可在此处获得:stackblitz.com/edit/angular-cjl4y6 当您在 Stackblitz 中刷新组件页面时,您可以看到图标闪烁的再现行为。控制台日志显示来自构造函数和 NgOnInit 的空数组。
  • 关于设置array.length,我指的是这个developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"你可以设置length属性随时截断一个数组。当你通过改变它的length属性来扩展一个数组时,数字实际元素的个数增加;例如,如果将长度设置为 3,而它当前为 2,则数组现在包含 3 个元素,这会导致第三个元素未定义。"
  • 非常感谢@Antoniossss。我为使用类似按钮的另一个组件找到的解决方法之一是将按钮移动到单独的组件中,并在选择一行时向父组件发出输出事件。然而,这是一个矫枉过正,你的解决方案要简单得多:-) 将在 Github 上打开一个相同的问题。
【解决方案2】:

您应该在声明 selectedTasks 变量时为其分配一个空数组。例如

public selectedTasks: yourArray = [];

您还可以在按钮中使用[disabled]="!selectedTasks.length" 而不是[disabled]="selectedTasks.length == 0"

要进行更多调试,您可以在组件的constractor() { in here }ngOnInit() { in here } 函数中添加console.log(selectedTasks)。这样您就可以在控制台中看到组件加载时发生的情况。

【讨论】:

  • 您知道[disabled]="selectedTasks.length" 的效果与selectedTasks.length===0 完全相反吧?
  • 你知道如果 undefinefd 会抛出异常并且不会用 aot 编译吗?
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2013-09-02
  • 1970-01-01
相关资源
最近更新 更多