Breeze 将实体编辑回其原始值时的 hasChanges()
Breeze hasChanges() when editing back an entity to its original values
我对 breeze 实体的变化检测有疑问。
假设我有一个处于 Changed
状态的实体,因为只有一个字符串属性发生了变化(例如从 'hello'
到 'hello2'
)。
如果我将此 属性 改回其初始值 'hello'
,我期望 hasChanges()
到 return 到 Unchanged
。但可惜状态仍然 Changed
.
这是预期的行为吗?如果是这样,有没有办法让 Breeze 使用其 originalValues 哈希映射来检查实际更改而不是 "dirtiness"?
有趣的问题。我不认为有什么方法可以让 breeze 根据比较来计算 hasChanges,但你可以将一些东西放在一起。
originalValues 哈希映射仅包含 breeze 认为已针对实体更改的属性。因此,您可以编写一个小函数来触发 entityChanged 事件并进行比较,如果没有差异,则将 entityState 设置为未修改。
类似于:
em.entityChanged.subscribe(function(changeArgs) {
var action = changeArgs.entityAction;
var entity = changeArgs.entity;
var ovs = entity.entityAspect.originalValues
if (action == breeze.EntityAction.PropertyChange) {
for (var prop in ovs) {
if (prop in entity) {
// As soon as a non-matching property is discovered,
// then 'Modified' is the appropriate state, so exit
if (entity[prop] !== ovs[prop]) return;
}
}
// all the properties are the same. mark it unchanged
entity.entityAspect.setUnchanged();
}
});
这超出了我的想象。我目前没有测试它的环境,所以我不确定我是否会按原样信任代码。
希望对您有所帮助。
我对 breeze 实体的变化检测有疑问。
假设我有一个处于 Changed
状态的实体,因为只有一个字符串属性发生了变化(例如从 'hello'
到 'hello2'
)。
如果我将此 属性 改回其初始值 'hello'
,我期望 hasChanges()
到 return 到 Unchanged
。但可惜状态仍然 Changed
.
这是预期的行为吗?如果是这样,有没有办法让 Breeze 使用其 originalValues 哈希映射来检查实际更改而不是 "dirtiness"?
有趣的问题。我不认为有什么方法可以让 breeze 根据比较来计算 hasChanges,但你可以将一些东西放在一起。
originalValues 哈希映射仅包含 breeze 认为已针对实体更改的属性。因此,您可以编写一个小函数来触发 entityChanged 事件并进行比较,如果没有差异,则将 entityState 设置为未修改。
类似于:
em.entityChanged.subscribe(function(changeArgs) {
var action = changeArgs.entityAction;
var entity = changeArgs.entity;
var ovs = entity.entityAspect.originalValues
if (action == breeze.EntityAction.PropertyChange) {
for (var prop in ovs) {
if (prop in entity) {
// As soon as a non-matching property is discovered,
// then 'Modified' is the appropriate state, so exit
if (entity[prop] !== ovs[prop]) return;
}
}
// all the properties are the same. mark it unchanged
entity.entityAspect.setUnchanged();
}
});
这超出了我的想象。我目前没有测试它的环境,所以我不确定我是否会按原样信任代码。
希望对您有所帮助。