对新实体进行更改时,RejectChanges() 不会撤消更改?

RejectChanges() doesn't undo changes when changes are made on a new entity?

我有一个工厂returns一个新实体:

//myDataFactory
//some other code here...
function create() {
    return manager.createEntity(entityName);
}

在我的控制器中,每当后端 returns 出现 404(未找到)时,我只需在激活控制器时触发 create() 方法,否则我会设置 object返回的内容。

        //myDataController
        //some other code here...
        init();

        function init() {
            var promises = [
                getMyData()
            ];

            console.log('populating MyData');
            return q.all(promises).then(function(){
                logger.info('populated MyData.');
            });
        }

        function getMyData() {
            return myDataFactory.getMyData(true).then(
                setMyData,
                createNewMyData
            );
        }

        function setMyData(data) {
            vm.myData = data[0];
        }


        function createNewMyData() {
            vm.myData = myDataFactory.create();
        }

在 UI 中,我有一个撤消按钮,它只是在 myDataController 中调用此函数:

function undo() {
   vm.myData.entityAspect.rejectChanges();
   vm.termsForm.$setPristine(true);
}

当从数据库返回 object 时,上面的 undo() 函数非常有效。但是,当我尝试对尚未保存的新创建实体进行更改时,当我单击撤消时,它不会恢复到原始值。为什么?我该如何解决这个问题?任何帮助将不胜感激。 :D

我正在使用 angularjs 和 breeze 顺便说一句。

"Original values" 是 现有 实体在您当前未保存的更改之前所具有的值。

一个新的实体...一个未从服务器检索且尚未保存的实体...缺少 "original values"。它只有 "current values"。因此,rejectChanges 没有回滚。

还有其他重要区别。查看 thing 实体的 thing.entityAspect.entityState.namebeforeafter 调用 rejectChanges.

如果之前的状态是"Modified",那么之后的状态就是"Unchanged"。但是如果之前的状态是 "Added",那么之后的状态是 "Detached" ...意味着 thing 不再在 EntityManager 缓存中并且可以进行垃圾回收。

考虑到这些事实,您希望行为是怎样的?一旦你知道,我们可以为你的场景制定一个令人满意的计划。

对于那些卡住的人,这是我根据我从 Ward 先生的回答中收集的内容得出的解决方案。我改用 entityState.isAdded()

function undo() {
    if (myDataIsNew()) {
        resetMyData();
    } else {
        vm.myData.entityAspect.rejectChanges();
    }
    setPristineForm();
}

function myDataIsNew() {
    // A new entity in cache that does not exist in the backend database
    return vm.myData.entityAspect.entityState.isAdded();
}

function resetMyData() {
    //clear each property.
}