如果撤消我的实体中的唯一修改,则使我的entityState变为Unchanged

时间:2013-10-29 14:08:38

标签: breeze

我正在和Breezejs合作。让我们说我有一个可观察的实体dummy充满了一些数据。用户通过html页面上的输入框修改了此实体的description属性。用户还可能在页面上的其他输入框上修改了该实体的其他属性。我的实体的entityState目前是Modified。接下来,我执行一些检查,并且需要通过代码撤消仅对此description属性进行修改。

如果这是唯一的修改,那么我希望我的entityState成为Unchanged

如果此实体还有其他修改,那么我希望按原样保留它们,并且仅撤消 description属性。

为什么我需要它?当页面上有一些待处理的修改时,我会显示SaveCancel按钮。如果只有1个修改并且我将其撤消,则启用SaveCancel按钮不是逻辑。

有可能吗?

感谢。


更新

这是我的实际实施:

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();
}

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

1 个答案:

答案 0 :(得分:2)

Breeze中的每个实体都有一个“entityAspect”属性,带有“originalValues”地图。因此,对于任何实体,您都可以查看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"]);
    }
}

希望这有帮助!