Breeze 将实体编辑回其原始值时的 hasChanges()

Breeze hasChanges() when editing back an entity to its original values

我对 breeze 实体的变化检测有疑问。

假设我有一个处于 Changed 状态的实体,因为只有一个字符串属性发生了变化(例如从 'hello''hello2')。

如果我将此 属性 改回其初始值 'hello',我期望 hasChanges() 到 return 到 Unchanged。但可惜状态仍然 Changed.

这是预期的行为吗?如果是这样,有没有办法让 Breeze 使用其 originalValues 哈希映射来检查实际更改而不是 "dirtiness"?

有趣的问题。我不认为有什么方法可以让 breeze 根据比较来计算 hasChanges,但你可以将一些东西放在一起。

originalValues 哈希映射仅包含 breeze 认为已针对实体更改的属性。因此,您可以编写一个小函数来触发 entityChanged 事件并进行比较,如果没有差异,则将 entityState 设置为未修改。

类似于:

em.entityChanged.subscribe(function(changeArgs) {
    var action = changeArgs.entityAction;
    var entity = changeArgs.entity;
    var ovs = entity.entityAspect.originalValues
    if (action == breeze.EntityAction.PropertyChange) {
        for (var prop in ovs) {
            if (prop in entity) {
                 // As soon as a non-matching property is discovered,
                 // then 'Modified' is the appropriate state, so exit
                 if (entity[prop] !== ovs[prop]) return;
            }
        }
        // all the properties are the same.  mark it unchanged
        entity.entityAspect.setUnchanged();
    } 
});

这超出了我的想象。我目前没有测试它的环境,所以我不确定我是否会按原样信任代码。

希望对您有所帮助。