在对新实体进行更改时,RejectChanges()是否撤消更改?

时间:2015-07-09 09:27:03

标签: angularjs breeze

我有一个工厂,它返回一个新的实体:

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

在我的控制器中,当后端返回404(未找到)时,我只是在激活控制器时触发create()方法,否则我将对象设置为返回的任何内容。

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

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

我正在使用带有微风btw的angularjs。

2 个答案:

答案 0 :(得分:1)

"原始价值"是现有实体在您当前未保存的更改之前的值。

一个新实体......一个未从服务器检索到但尚未保存的实体......缺少"原始值"。它只有"当前值"。因此,rejectChanges无需回滚。

还有其他重要的差异。查看thing.entityAspect.entityState.name实体的thing 之前的之后的 rejectChanges

如果之前的状态是"修改",之后的状态是"未更改"。但如果以前的状态是"添加",之后的状态是" Detached" ...意味着thing不再位于EntityManager缓存中,并且已经适合垃圾收集。

考虑到这些事实,您希望这种行为是什么?一旦你知道,我们就可以为你的方案制定一个令人满意的计划。

答案 1 :(得分:0)

对于那些被困的人,这是我根据沃德先生的回答收集的解决方案。我改为使用了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.
}