你是对的,微风不提高propertyChanged
当。。。的时候EntityState
变化。也许应该如此。我们会考虑这一点。
Breeze 也没有单独的活动在实体上 - no entityStateChanged
事件 - 当发生事件时通知您EntityState
变化。我们已经考虑过好几次了。我们一直劝说自己不要这么做。
有一个完美的解决方案,其性能比专用的更好entityStateChanged
事件。现在你必须自己编码。
诀窍是倾听EntityManager
,而不是实体。您将在以下位置找到此解决方案的一种变体:文档代码“教学测试”样本;寻找 ”可以通过entityManager.entityChanged控制自定义ko的entityState属性“ 在里面实体测试.js module.
我会调整它以适合您的示例。其本质如下:
订阅entityManager.entityChanged
事件;当它被升起时and原因是一个实体的EntityState
更改,您更新该实体的isChanged
布尔 KO 可观察(如果该属性存在)。
Add the isChanged
可观察到应该以这种方式观察的实体类型。
以下是步骤 #1 的示例:监听状态更改
// subscribe with handler watching for EntityState changes
addEntityStateChangeTracking(manager);
function addEntityStateChangeTracking(entityManager) {
if (entityManager._entityStateChangeTrackingToken) { return; } // already tracking it
// remember the change tracking subscription with a token;
// might unsubscribe with that token in future
entityManager._entityStateChangeTrackingToken =
entityManager.entityChanged.subscribe(entityChanged);
var entityStateChangeAction = breeze.EntityAction.EntityStateChange;
function entityChanged(changeArgs) {
if (changeArgs.entityAction === entityStateChangeAction) {
var entity = changeArgs.entity;
if (entity && entity.isChanged) { // entity has the observable
var isUnchanged = entity.entityAspect.entityState.isUnchanged();
entity.isChanged(!isUnchanged);
}
}
}
}
我们来谈谈步骤#2:添加isChanged
可观察到类型。你似乎已经解决了这个问题,但我不确定如何解决。也许将其添加到类型中的最佳位置是在类型的初始值设定项因此,您可以确定该属性将存在,无论该实体是通过查询创建还是具体化。这是一个例子:
var store = manager.metadataStore;
function customerInit(entity) {
var isUnchanged = entity.entityAspect.entityState.isUnchanged();
entity.isChanged = ko.observable(!isUnchanged);
}
store.registerEntityTypeCtor('Customer', null, customerInit);
这一切看起来工作量很大。如果 Breeze 提高了的话会更容易propertyChanged
事件,当EntityState
变化。我们会更多地考虑......可能会有一些很好的反驳论点。同时,我认为您在这里看到的是最好的方法。