【问题标题】:breeze: behavior of setDeleted微风:setDeleted 的行为
【发布时间】:2014-01-17 06:15:26
【问题描述】:

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

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

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

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

myEntity.entityAspect.setDeleted();

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

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

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

【问题讨论】:

  • 您使用的是哪个网格?,角度?请提供有关如何将实体绑定到网格的更多信息,谢谢
  • 这是一个轻而易举的问题,与 UI 无关;)

标签: breeze


【解决方案1】:

我的猜测是您的集合是 Breeze 导航属性之一的值。这些集合是“实时的”,因为如果您删除一个实体,该实体就会从它所属的所有实时集合中删除。

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

【讨论】:

  • 猜得好。如果我编辑集合中的这些实体之一会发生什么?当我调用 saveChanges 时,它们是否会作为它们所属的导航属性的一部分保留下来?还是我必须将它们复制回导航属性?如果是这样,那可能会很乏味。
  • 您应该只制作集合的副本,里面的实体应该是与原始集合相同的实例......所以它们将被正确持久化,您不需要将它们复制回导航属性。
  • 谢谢,这个答案很有帮助。不知道导航属性在删除时会自行删除。但它解释了很多;)
【解决方案2】:

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

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

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

我们可以通过让“分离”操作同时删除导航属性来解决此问题,但规则开始变得难以解释。

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

您能否详细说明您所看到的“验证”?这些验证是针对“已删除”实体还是针对指向已删除实体的仍然存在的实体?没有第一次发生很有意义(如果是这种情况,我们应该修复它),没有第二次发生没有意义,因为您确实导致了真正的验证失败。

【讨论】:

    【解决方案3】:

    好的,我已经尝试过 Jay 的解决方案。首先我使用 lodash.js 做一个深拷贝:

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

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

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

    问题在于,微风将我实体的所有导航属性设置为空(请参阅微风.js 中的 removeFromRelationsCore 函数)。

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

    总结一下我有两个问题:

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

    你能解释一下吗?

    编辑

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

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

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

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

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

    【讨论】:

    • 一般来说,用户语音是为了功能,而不是错误。根据你给我的信息,我会看看这两个,但可能需要几天时间。请确认您已在 Breeze 1.4.8 上检查过此项?
    • 实际上,我不在服务器端 dll 的 1.4.8 上。我使用来自 github 的最新版本(因为 NH 提供程序有一个错误修复,但尚未在 1.4.8 中)。对于客户端脚本,我使用的是 1.4.8。感谢您的关注!
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2013-02-09
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多