我有一个工厂,它返回一个新的实体:
//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。
答案 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.
}