问题标签 [dirty-checking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
202 浏览

angular - 如何通过重新输入原始值使 Angular 表单字段“干净”?

在我使用 Angular 表单的代码库中,用户打开一个要编辑的条目,并且各个字段都预先填充了当前值。该Save按钮开始禁用,因为没有任何东西dirty在角度意义上。如果用户输入一个字段并开始输入,该字段将变脏并Save启用。

在编辑表单值的过程中,如果出现以下情况,则会进行禁用Save按钮的检查:

  • 必填字段为空,
  • 需要特定格式的字段有无效条目,
  • 条目比允许的长,

......等等,最后

  • 值,即使dirty,现在在用户打开表单时恢复为原始值。

这是它的精髓:

两个问题:

A. 虽然从一个角度来看它似乎“显而易见”(没有任何改变,所以为什么要保存它?),最后一点是 UX 意义上的常见最佳实践吗?希望看到有关它的文章或参考资料。

B. Angular 表单有没有办法自动执行此操作(即,将字段设置回非脏),而无需添加显式代码来检查新值与旧值的对比?

0 投票
1 回答
315 浏览

hibernate - 防止 Hibernate 对具有脏 OneToMany 集合的实体发出不必要的更新

我们将 Hibernate 5.3.13 与 Spring Data JPA 2.1.12 一起使用,并且当有一个已经持久化、托管的最小实体时,如下所示:

包含以下内容Embeddable

现在,每当使用添加到集合中的已持久化托管事件进行调用EventsHolder.events.add(...)时,休眠 - 在进行自动刷新时 - 将检测到该EventsHolder.Events.events集合是脏的org.hibernate.event.internal.DefaultFlushEntityEventListener#hasDirtyCollections ,并将发出(不确定这是否是这里的重要先决条件)一个 Pre -更新对 Spring Data 的 AuditingHandler 的调用,它将更新 modifiedOn。

最后,optimisticLockingVersion 会增加,hibernate 会发出一个更新语句,基本上只更新修改后的版本和版本。

使用包含 5000 个事件的 EventsHolder,我们看到 optlock-versions 大约在 4500-5000 左右,并且数据库的审计日志被所说的“非更新”所困扰,这些“非更新”仅更新修改后的版本和乐观锁定版本。

任何关于如何阻止这种行为的想法都非常感谢。

0 投票
2 回答
1499 浏览

view - 在 Svelte 中,您可以使用 `array = array` 在视图中将数组标记为需要刷新?

也就是说,使用

触发视图以当前刷新array

例如,以下使用

向数组“添加”一个条目cards,但通过分配cards给一个新数组,并且cards在视图中将被刷新。

示例:https
://svelte.dev/repl/3ed20e7bac2e4b65944c98485d9217b3?version=3.18.1 (只需输入一些名称,下面的列表就会更新)。

但是,输入n名称时这是 O(n²),因为每次创建一个新数组都是 O(n)。如果 (1) 用户希望一次输入几个或十几个名字,这不是什么大问题,或者 (2) 用户可能输入一个名字几秒钟到 20 秒,那么任何延迟当条目多达 1000 个或 2000 个名称时,UI 的 0.2 秒不是一个大问题。(用户可能会更好地添加到服务器和数据库,以防万一停电。)

但如果我们不想要 O(n²) 时间,我们也可以使用:

这将触发视图中的刷新。所以 Svelte 不做“脏检查”?与 Angular、Vue 和 React 相比,它们是通过实际将数组转换为字符串并检查数组是否发生变化来进行脏检查吗?

示例:https ://svelte.dev/repl/70cc3b08f6864ef387c691b8f126a7fd?version=3.18.1

如果没有该行cards = cards;,列表将不会在视图中更新:

示例:https ://svelte.dev/repl/25f41c51798d425e805fb4586a843363?version=3.18.1

cards = something;所以Svelte实际上并没有进行脏检查,而是cardscards = cards那么,如果我们使用它作为一种通用技术来标记某些东西是脏的,那么我们可以使用array.push()它来让程序运行得更快吗?Svelte 真的可以cards通过检测到有一个cards.push()语句来猜测这种情况发生了变化吗?

更新:发现通过为每个列表项添加一个键cards = cards是不需要的,我想知道为什么:

https://svelte.dev/repl/d78158ae54684bf28b8c2e9b527f1915?version=3.18.1

0 投票
2 回答
217 浏览

angular - 除了用户交互之外,究竟是什么将 Angular2 反应式 FormControl 标记为脏?

这是一个深入了解 Angular Reactive Forms 的问题。

我们将在每个对话框中创建许多带有许多 FormControl 对象的复杂组件。对于这些 FormControl 对象,许多事情是在运行时动态设置的:

  • 模型数据(明显)
  • 验证规则(通过control.setValidators(valArray)
  • 启用/禁用(例如通过control.disable()

代码示例太大,无法在此处显示。

问题是:在将所有组件设置为新值、验证和启用以及最终this.formGoup.marktAsPristine()某些字段仍然或再次脏之后

一件事是,我们还有一些 Angular 典型的并发主题需要解决。因此,目前,很可能在那之后this.formGoup.marktAsPristine()一些并发活动仍在运行。但是对于我对 Angular 的理解:

如果到目前为止没有发生用户交互,哪些操作可以再次将 FormControl 设置为脏?

文档和我相当厚的 Angular 书无法向我解释。