breeze:setDeleted的行为

时间:2014-01-15 10:31:56

标签: breeze

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

每行都有一个删除按钮。

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

所以在删除按钮事件处理程序中,我这样做:

myEntity.entityAspect.setDeleted();

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

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

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

3 个答案:

答案 0 :(得分:3)

我的猜测是你的收藏品是Breeze导航属性之一的价值。这些集合是“实时”的,如果您删除实体,该实体将从其所属的所有实时集合中删除。

因此,最好的答案是将实体复制到您自己的集合中并绑定到该集合。您自己的收藏品不会“直播”,删除实体也不会将其从收藏中删除。

答案 1 :(得分:1)

好的,我试过Jay的解决方案。首先,我使用lodash.js进行深层复制:

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

然后我将网格绑定到$ scope.sourceMaterials。用户单击给定行的删除按钮,我执行:

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

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

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

总结一下,我有两个问题:

    删除我的实体时,
  1. 导航属性不应设置为null
  2. 不应为状态设置为已删除的实体触发验证
  3. 你能否对此有所了解?

    修改

    在Jay回答之后,我可以确认:

    1)导航属性从已删除的实体中取消,我希望以某种方式防止

    例如:我有一个实体文档,其中包含1 - > 1 np名为DocumentType。如果我在Document上设置了deleted,那么Doc​​umentType将被清零。

    2)验证规则发生在已删除实体的属性(已被删除的实体)

    我应该报告用户语音中的哪一个问题?

答案 2 :(得分:1)

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

当你说你不想在删除后将导航属性设置为null时我假设你在谈论标量(1-> 1)或(n-> 1)导航。 (非标量导航只是从集合中删除实体)第一个问题是你是在谈论导航'到'被删除的实体还是'从'删除的实体。如果“NOT”将导航“删除”为已删除的实体,我们将导致许多(如果不是大多数)现有的breeze应用程序失败。大多数应用程序希望在删除实体时看到实体消失。

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

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

如果您仍然对此感到强烈,请将您的建议发布到Breeze用户语音。如果我们看到对此有一些实质性的兴趣,我们将尝试提出一个解决方案,但是现在我们没有一个好的答案,没有增加真正的概念复杂性。 (我们真的试图避免的东西)。

您能否提供有关您所看到的'验证'的更多详细信息?这些验证是在“已删除”实体上还是在指向已删除实体的仍处于活动状态的实体上?没有第一次出现很有意义(如果是这种情况我们应该修复它),没有第二次出现没有意义,因为你真的导致真正的验证失败。