我有一个显示实体列表的网格。
每行都有一个删除按钮。
一旦用户点击了给定实体的删除按钮,我想更改行的css并用取消按钮替换删除按钮。
所以在删除按钮事件处理程序中,我这样做:
myEntity.entityAspect.setDeleted();
但是一旦我这样做,实体就会从集合中移除,行会从网格中消失。
有没有办法防止这种情况?我只想将实体标记为“已删除”,并推迟任何更改,直到用户点击“保存”按钮。
我看到的唯一选择是将一个属性isDeleted添加到我的客户端模型中,并以此为基础构建逻辑。但这意味着我必须自己处理更改跟踪并在保存时循环实体,以调用isDeleted属性为true的实体的setDeleted。我不喜欢这个解决方案。有什么更好的东西我迷失了微风?
答案 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函数)。
这样做会影响屏幕上显示给用户的值。例如,一个必填字段被微风掩盖。因此,当用户单击“保存”按钮时,验证将失败。
总结一下,我有两个问题:
你能否对此有所了解?
修改强>
在Jay回答之后,我可以确认:
1)导航属性从已删除的实体中取消,我希望以某种方式防止
例如:我有一个实体文档,其中包含1 - > 1 np名为DocumentType。如果我在Document上设置了deleted,那么DocumentType将被清零。
2)验证规则发生在已删除实体的属性(已被删除的实体)
上我应该报告用户语音中的哪一个问题?
答案 2 :(得分:1)
1)的问题是当你删除一个实体时,我们需要切断它与任何其他实体的关系。这实际上是删除的本质,我们希望在提交删除后环境看起来像是通过EntityManager.saveChanges())
当你说你不想在删除后将导航属性设置为null时我假设你在谈论标量(1-> 1)或(n-> 1)导航。 (非标量导航只是从集合中删除实体)第一个问题是你是在谈论导航'到'被删除的实体还是'从'删除的实体。如果“NOT”将导航“删除”为已删除的实体,我们将导致许多(如果不是大多数)现有的breeze应用程序失败。大多数应用程序希望在删除实体时看到实体消失。
如果'NOT'从已删除的实体中删除导航,则该概念会更有意义,除非您导致另外两个问题。首先,这会破坏任何“双向”导航,即您不能再在“从”和“到”导航之间往返。但更重要的是,我们将“删除”视为最终“分离”操作的前兆(将在成功保存后发生)。 'detach'的主要价值在于它恢复了内存,因为我们已经有效地删除了对'deleted'对象的任何引用,这意味着它可以被垃圾收集。如果我们保持任何导航属性不变,那么垃圾收集将永远不会发生,并且最终导致内存泄漏。
我们可以通过让'detach'操作也删除导航属性来解决这个问题,但规则开始变得难以解释。
如果您仍然对此感到强烈,请将您的建议发布到Breeze用户语音。如果我们看到对此有一些实质性的兴趣,我们将尝试提出一个解决方案,但是现在我们没有一个好的答案,没有增加真正的概念复杂性。 (我们真的试图避免的东西)。
您能否提供有关您所看到的'验证'的更多详细信息?这些验证是在“已删除”实体上还是在指向已删除实体的仍处于活动状态的实体上?没有第一次出现很有意义(如果是这种情况我们应该修复它),没有第二次出现没有意义,因为你真的导致真正的验证失败。