breeze: behavior of setDeleted



我有一个显示实体列表的网格。

每一行都有一个删除按钮。

一旦用户点击了给定实体的删除按钮,我想更改行的css,并用取消按钮替换删除按钮。

所以在删除按钮事件处理程序上,我做了:

myEntity.entityAspect.setDeleted();

但一旦我这样做,实体就会从集合中删除,行也会从网格中消失。

有办法防止这种情况发生吗?我只想将实体标记为"已删除",并推迟任何更改,直到用户单击保存按钮。

我看到的唯一替代方案是将属性isDeleted添加到我的客户端模型中,并以此为基础进行逻辑处理。但这意味着我必须自己处理更改跟踪,并在保存时循环实体,为isDeleted属性为true的实体调用setDeleted。我不喜欢这种解决方案。有什么比这更好的东西让我在微风中错过了吗?

我猜测您的集合是Breeze的一个导航属性的值。这些集合是"活动"的,因为如果删除实体,则该实体将从其所属的所有活动集合中删除。

因此,最好的答案是将实体复制到您自己的集合中并绑定到该集合。您自己的集合将不是"活动"的,删除实体也不会将它们从集合中删除。

1)的问题是,当您删除一个实体时,我们需要切断它与任何其他实体的关系。这确实是删除的本质,我们希望环境在提交删除后看起来像这样(通过EntityManager.saveChanges())

当您说您不希望在删除后将导航属性设置为null时,我假设您谈论的是标量(1->1)或(n->1)导航。(非标量导航只是从集合中删除实体)第一个问题是,您所说的导航是"To"已删除实体还是"from"已删除的实体。在"不"删除导航到"已删除的实体"的情况下,我们将导致许多(如果不是大多数的话)现有的微风应用程序失败。大多数应用程序希望看到实体在您删除它们时消失。

在"NOT"从已删除的实体中删除导航的情况下,这个概念更有意义,只是你会导致另外两个问题。首先,这会中断任何"双向"导航,即您不能再在"from"one_answers"to"导航之间往返。但更重要的是,我们将"删除"视为最终"分离"操作(将在成功保存后发生)的前兆。"detach"的主要值是它可以恢复内存,因为我们已经有效地删除了对"deleted"对象的任何引用,这意味着它可以被垃圾回收。如果我们保持任何导航属性不变,这种垃圾收集将永远不会发生,并且最终会导致内存泄漏。

我们可以通过让"分离"操作也删除导航属性来解决这个问题,但规则开始变得更难解释。

如果你对此仍然有强烈的感受,请将你的建议发布到微风用户之声。如果我们对此感兴趣,我们将尝试想出一个解决方案,但目前我们还没有一个好的答案,不会增加真正的概念复杂性。(这是我们真正试图避免的)。

你能提供更多关于你所看到的"验证"的细节吗?这些验证是在"已删除"实体上还是在指向已删除实体的仍然有效的实体上?不发生第一次是有意义的(如果是这样的话,我们应该修复它),不发生第二次是没有意义的,因为你确实导致了真正的验证失败。

好的,我已经尝试了周的解决方案。首先,我使用lodash.js:进行深度复制

$scope.sourceMaterials = _.clone($scope.request.sourceMaterials, true);

然后我将我的网格绑定到$scope.sourceMaterials。用户点击给定行的删除按钮,我就这样做了:

var document = $scope.sourceMaterials[index];
document.entityAspect.setDeleted();

问题是,breeze将我实体的所有导航属性设置为null(请参阅breez.js中的removeFromRelationsCore函数)

这样做会影响屏幕上显示给用户的值。例如,其中一个必填字段被微风吹空。因此,当用户单击保存按钮时,验证将失败。

总之,我有两个问题:

删除实体时,
  1. 导航属性不应设置为null
  2. 对于状态设置为已删除的实体,不应触发验证

你能解释一下吗?

编辑

根据周的回答,我可以确认:

1) 导航属性从已删除的实体为null,我希望以某种方式阻止

例如:我有一个名为DocumentType的1->1 np实体Document。如果我在Document上设置了delete,则DocumentType为null。

2) 验证规则发生在已删除实体的属性上(那些为空的)

关于用户语音,我应该报告以下哪一个问题?

最新更新