对新实体进行更改时,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.name
在 before 和 after 调用 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.
}
我有一个工厂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.name
在 before 和 after 调用 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.
}