Breeze 如果撤消实体中的唯一修改,则使我的entityState保持不变

Breeze 如果撤消实体中的唯一修改,则使我的entityState保持不变,breeze,Breeze,我和Breezejs一起工作。假设我有一个可观察的实体dummy填充了一些数据。用户通过html页面上的输入框修改了该实体的description属性。用户可能还修改了页面上其他输入框中此实体的其他属性。此时,我的实体的entityState已修改。接下来,我执行一些检查,只需按代码撤消对该属性的修改 如果这是唯一的修改,那么我希望我的entityState保持不变 如果此实体上有其他修改,则我希望保持原样,只撤消说明属性 我为什么需要它?当页面上有一些悬而未决的修改时,我会显示保存和取消按钮。

我和Breezejs一起工作。假设我有一个可观察的实体
dummy
填充了一些数据。用户通过html页面上的输入框修改了该实体的
description
属性。用户可能还修改了页面上其他输入框中此实体的其他属性。此时,我的实体的entityState已修改。接下来,我执行一些检查,只需按代码撤消对该属性的修改

如果这是唯一的修改,那么我希望我的entityState保持
不变

如果此实体上有其他修改,则我希望保持原样,只撤消
说明
属性

我为什么需要它?当页面上有一些悬而未决的修改时,我会显示
保存
取消
按钮。如果只有一个修改,我将其撤消,那么启用
保存
取消
按钮就不符合逻辑

可能吗

谢谢


更新

以下是我的实际实现:

private tryReject() {
    // if any modified values are the same as original values >> reject
    var rejectPossible = true;
    for (var name in this.dummy().entityAspect.originalValues) {
        var oldVal = this.dummy().entityAspect.originalValues[name];
        var newVal = this.dummy()[name]();
        if (oldVal != newVal) rejectPossible = false;
    }
    if (rejectPossible) this.dummy().entityAspect.rejectChanges();
}

也许有一种更聪明或更干净的方法?

Breeze中的每个实体都有一个带有“originalValues”映射的“entityAspect”属性。因此,对于任何实体,您都可以查看originalValues映射,然后只撤消一个属性或全部属性。类似这样的(未经测试)

希望这有帮助

var originalValues = myEntity.entityAspect.originalValues;
if (originalValues.hasOwnProperty("description") {
    if (Object.keys(originalValues).length === 1) {
      // this is the only change - so just reject everything - state will become "Unchanged" as a result.
      myEntity.entityAspect.rejectChanges();
    } else {
      // else just reverse this single property
      myEntity.setProperty("description", originalValues["description"]);
    }
}